Problem mit regulären Ausdrücken

Hallo zusammen,

ich habe ein Problem mit den regulären Ausdrücken in PHP. Habe mir schon haufenweise Seiten angesehen find den Fehler aber nicht.
Hier ersteinmal ein Beispiel wo der Fehler auftritt:

http://www.sign-solutions.de/10021_job/texte/show.ph…

Dort sieht man im oberen Teil des Textes das die [size=18] und [/size] Tags nicht replaced wurden. Hier meine Funktion mit der ich dieses eigentlich realisieren wollte:

######################################################################

function formCheck($text)
{
$suchmuster = ‚([]+)‘;

$text = ereg_replace(
„[url=([-_./a-zA-Z0-9 !&%#?,’=:~]+)]“.
„$suchmuster[/url]“,
\2“, $text);

$text = ereg_replace(
„[email=([-_./a-zA-Z0-9 !&%#?,’=:~]+)]“.
„$suchmuster[/email]“,
\2“, $text);

$text = ereg_replace(
„[size=([-_./a-zA-Z0-9 !&%#?,’=:~]+)]“.
„$suchmuster[/size]“,
„\2“, $text);

$text = ereg_replace(
„[color=([-_./a-zA-Z0-9 !&%#?,’=:~]+)]“.
„$suchmuster[/color]“,
„\2“, $text);

$text = ereg_replace(
„[left]“.
„$suchmuster[/left]“,
" \1 ", $text);

$text = ereg_replace(
„[center]“.
„$suchmuster[/center]“,
" \1 ", $text);

$text = ereg_replace(
„[right]“.
„$suchmuster[/right]“,
" \1 ", $text);

return $text;
}

######################################################################

Findet ihr vielleicht den Fehler? Ich verzweifel echt dran. Bin da sicher schon 3 Wochen nur an dem einen Problem dran…

Danke schonmal!!!

Hallo roach,

ich habe ein Problem mit den regulären Ausdrücken in PHP. Habe
mir schon haufenweise Seiten angesehen find den Fehler aber
nicht.
Hier ersteinmal ein Beispiel wo der Fehler auftritt:

http://www.sign-solutions.de/10021_job/texte/show.ph…

OK, ich habe mir die Seite mal lokal runtergeladen, fol-
gender Regex ersetzt alle Vorkommen von […]
durch den Text bzw.

 <sub>$file = "dnload.html";</sub><sub>$_ = do { local( @ARGV, $/ ) = $file ; }; # lokal einlesen</sub>

 s/\[\/?\D\*:?(\d\*)\]/""/eg;

<sub># wenn <u>nur</u> size, dann:</sub><sub># s/\[\/?size\D*:?(\d*)\]/""/eg;</sub><sub>print;</sub>

Resultat: schreibt Deine Seite raus,
überall, wo vorher [size…] oder [/size…] stand,
steht also jetzt und

Oder wolltest Du was ganz anderes?

Im Prinzip musst Du nur den Regex (perl-syntax)
mit dem /global/eval-Modifier in die PHP-Regex-Engine
füttern (hab leider kein PHP zur Hand, aber so
schwierig wirds nicht sein …)

Grüße

CMБ

Öm wüsst ich mal was du da jez genau machst. Mein Problem is nur die Zeile wo ich das Suchmuster festlege:

([]+)

Das ist ja mein Suchmuster. Das Funktioniert auch alles soweit. Nur wenn ich jez in meinen Tags ein Newline drin hab funktioniert das alles nicht mehr. ISt das nicht mit dem \n erledigt? Oder wo könnte sonst der Fehler sein? Weil sonst funktioniert das ja.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

PHP kann closures und eval’d replacements (Staun!)
Hallo roach,

ich habe gestern wieder mit PHP auf meinem
Spielserver herumgemacht und bin dabei
zu interessanten Schlüssen gekommen.

Wahrscheinlich hattest Du das Problem selbst
schon inzwischen gelöst, aber hier noch mein
Senf dazu.

Mein Problem is nur die Zeile wo ich das Suchmuster festlege:

([]+)

Das ist ja mein Suchmuster. Das Funktioniert auch alles
soweit. Nur wenn ich jez in meinen Tags ein Newline drin hab
funktioniert das alles nicht mehr. ISt das nicht mit dem \n
erledigt?

IMHO musst Du den Vergleich explizit auf „multiline match“ /m
setzen, das ist imho nicht „automatisch“ bei den ereg_
Funktionen so (korrigiert mich bitte).

Oder wo könnte sonst der Fehler sein? Weil sonst
funktioniert das ja.

Nun ja, „funktionieren“ tut es ja eben mehr oder
weniger, wie Du schreibst. Das Problem ist imho, -
der Code (match-Muster) ist ‚broken by design‘. Anstatt
alle möglichen Zeichen anzugeben, die vorkommen können,
reicht es imho auch, einfach .*? hinzuschreiben, gefolgt
von der hinteren Begrenzung, also .*?] oder besser
gleich [^]]*? - eine Zeichenklasse […], die nicht
dem Abschlusszeichen ‚]‘ entspricht.

Ich hatte mir ja damals Deinen Quelltext teilweise
kopiert - und kam jetzt zu dem Schluss, dass man
hier einfach mit einer Tabelle der Ersetzungen von
arbeiten kann (und sollte). Man muss gar nicht den
gesamten Text zwischen und kopieren, es
reicht imho, die Tags selbst umzuwandeln.

Idealerweise würde man für jede Ersetzung eine
spezielle Funktion() „on the run“ dynamisch
erzeugen (closure in Perl), die die Ersetzung
optimal durchführt. Überraschenderweise geht
das in PHP(!), wenn auch leicht unschön.

Deine gesamte Ersetzung wird durch folgendes
Programm ausgeführt (sofern der Text in $text steht:

<?php function sub($p1, $p2, $p3, $code) {<br /> $closure = create\_function('$param,$slash',"return $code");
 return $closure($p3, $p1);
 }

 $tags= array( 
 'url' =\> '(!$slash ? "[" : "](%255C'%2524param%255C')");',
 'email' =\> '(!$slash ? "[" : "](%255C'mailto:%2524param%255C')");',
 'size' =\> '(!$slash ? "" : "");',
 'color' =\> '(!$slash ? "" : "");',
 'left' =\> '(!$slash ? " " : " " );',
 'center' =\> '(!$slash ? " " : " " );',
 'right' =\> '(!$slash ? " " : " " );',
 );

 foreach (array\_keys($tags) as $tag) {
 $pat = "{ \[ # oeffnende Klammer [
 (/?) # Match $1, ein Slash '/' (oder keiner)
 ($tag)=? # $2 - der Begriff selbst (size, email, url ...)
 ([^]]\*?) # $3 - der Parameter, Zeichenklasse [] mit '^]' (alles bis zu ']')
 \] # schliessende Klammer ]
 }ex"; # e=eval($match), x=mit schoener Formatierung
**$text = <u>preg_replace</u>($pat, 'sub("$1","$2","$3",$tags[$tag])', $text);**
 }

 echo $text;
?\>

Falls einiges unklar blieb, gebe ich gerne Auskunft.

Grüße

CMБ

HACH DU BIST DER GRÖßTE :smiley: DANKEEEEE :smiley:
Und ich dachte das Problem bekomm ich nie gelößt. Jez auch noch soviel Stress in der Firma da hatte ich kaum Zeit. Also nochmal DANKEDANKEDANKE :smiley:

Es gibt nur noch ein er unterscheidet nicht zwischen „left_img“ und „left“. Ist aber eigentlich kein Problem dann nimm ich für left_img halt limg oder so. Aber kann ja sein das du sofort weißt wo eine Zeile geändert werden muss damit es passt. Wenn nich teste nich rum. Ich bin dir echt so dankbar!!!

Hallo roach,

Es gibt nur noch ein er unterscheidet nicht zwischen
„left_img“ und „left“. Ist aber eigentlich kein Problem dann
nimm ich für left_img halt limg oder so.

Kannst Du mal bitte ein Stück Text hier einfügen,
in dem left_img vorkommt? Was macht das? Wodurch
soll das dann ersetzt werden?

Grüße

CMБ

[left_img]bilder/bla.jpf[/left_img]

es richtet ein bild linksbündig aus…

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo roach,

Kannst Du mal bitte ein Stück Text hier einfügen,
in dem left_img vorkommt? Was macht das? Wodurch
soll das dann ersetzt werden?

[left_img]bilder/bla.jpf[/left_img]
es richtet ein bild linksbündig aus…

OK, aber was genau soll im html stehen.
Falls das Resultat

lauten soll, kann ich folgende Lösung anbieten.
(Ich habe mal den PHP-Quelltext etwas gestrafft,
sämtlichen unnötigen Code aus dem Array genommen):

<?php function sub($p1, $p2, $p3, $op) {<br /> $closure = create\_function('$param,$slash','return(!$slash?"'.$op[0].'":"'.$op[1].'");');
 return $closure($p3, $p1);
 }

 $opcodes = array (
 'url' =\> array( '[', '](%255C%2522%2524param%255C%2522)' ),
 'email' =\> array( '[', '](%255C'mailto:%2524param%255C')' ),
 'size' =\> array( '', '' ),
 'color' =\> array( '', '' ),
 'left' =\> array( ' ', ' ' ),
 'right' =\> array( ' ', ' ' ),
 'center' =\> array( ' ', ' ' ),
 'left\_img' =\> array( ' ' ),
 'right\_img' =\> array( ' ' ),
 'center\_img' =\> array( ' ' ),
 );

 foreach (array\_keys($opcodes) as $tag) {
 $pat = "{ \[ # oeffnende Klammer [
 (/?) # Match $1, ein Slash '/' (oder keiner)
<u>($tag<b>\b</b>)</u>=? # $2 - der Begriff selbst (size, email, url ...)
 ([^]]\*?) # $3 - der Parameter, Zeichenklasse [] mit '^]' (alles bis zu ']')
 \] # schliessende Klammer ]
 }ex"; # e=eval($match), x=mit schoener Formatierung
 $text = preg\_replace($pat, 'sub("$1","$2","$3",$opcodes[$tag])', $text);
 }

 echo $text;
?\>

Grüße

CMБ