globe: Grosses preg_replace - Problem...

Beitrag lesen

n'abend,

$pfad = "PFAD";
$pattern = '/[[(.*)|(.*)]]/eisU';

du erwartest »[[etwas|anderes]]«, den Fall »[[etwas]]« hast du hier gar nicht berücksichtigt. Das ist auch der Grund, warum dein Test misslingt. Siehe unten

Schau dir bitte die Pattern Modifiers noch mal genauer an.
»e« bedeutet, dass der replace-string als PHP interpretiert werden soll - willst du das hier wirklich?
»s« bedeutet, dass auch Zeilenumbrüche durch . (DOT_ALL) erkannt werden sollen - willst du das hier wirklich? Kann / darf es Zeilenumbrüche in deinen [[blubb]] Tags geben?
»U« macht an dieser Stelle mehr oder weniger Sinn. UNGREEDY bewirkt, dass DOT_ALL nur soviel liest, wie es minimal lesen kann.

$ersatz = '<a href="'.$pfad.'/\1">\2</a>';

hast du dir durchgelesen, wie sich das mit dem Replace-String in preg_replace() so verhält?

$string = preg_replace($pattern, $ersatz, $string);

Originalstring: Das ist ein Testsatz. Dieser Testsatz ist in einem [[String]] gespeichert und soll via preg_replace [[Arbeit|bearbeitet]] werden - leider sind aber meine bisherigen [[Bemühung|Bemühungen]] recht erfolglos.

Dein RegeExp matcht hier (zufällig). Aber nicht ganz so, wie du dir das vorstellst:

/[[(.*)|(.*)]]/
\0 ist dabei »[[String]] gespeichert und soll via preg_replace [[Arbeit|bearbeitet]]«
\1 ist dabei »String]] gespeichert und soll via preg_replace [[Arbeit«
\2 ist dabei »bearbeitet«

Ich komme einfach nicht weiter und möchte daher um eure Mithilfe bitten:
a) wo ist mein Fehler bzw. was muß ich an der regexp verändern (bitte wenn möglich auch mit Erklährung, damit ich auch verstehe was falsch gelaufen ist)

Du kannst Bereiche mit einem ? optional machen:
/[[(.*)(|(.*))?]]/ -- achtung, die Indexe in deinem Replace-String werden sich hierbei ändern.

Der Punkt-Operator (DOT_ALL) matcht jedes Zeichen. Willst du nicht vielleicht nur Buchstaben (und ggf. Zahlen) matchen? Etwa so:
/[[([a-zA-Z0-9]+)(|([a-zA-Z0-9]+))?]]/

Du kannst auch, wenn du nicht mit einer Callback-Funktion arbeiten willst (was du aber wegen unterschiedlicher Indexe vermutlich machen willst) zwei separate RegExps benutzen, einer der [[string]] matcht und einer der [[string|string2]] matcht.

b) wie kann ich zudem den Wert "\1" in ein Array bekommen ?

du könntest dir mal preg_replace_callback() anschauen.

weiterhin schönen abend...

--
#selfhtml hat ein Forum?
sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|