reguläre ausdrücke ersetzen
-
Hi,
sagen wir ich habe folgenden Text in einer Variablen:
Dies ist ein Text bla [LINK]DEFAULT::cat=20::überschrift[/LINK] mit ganz vielen Infos [LINK]DEFAULT2::cat=33::Kunst[/LINK] und nun möchte ich die Links setzen.
Diesen lese ich aus einer Datenbank. Weil meine Seite mit Sessions arbeitet will ich mir die Links in echtzeit reinbauen. In den Link Tags trenne ich die verschiedenen Parameter durch ein ::
Alles was zwischen den LINK Tags ist, will ich nun durch folgendes ersetzen (Die link Tags müssen danach dann auch mit verschwinden:
"<a href="' . tep_href_link(Parameter1,Parameter2) . "'>" . Parameter3 . "</a>"
Somit wäre es mir möglich die links in echtzeit richtig darzustellen. Hat jemand eine Idee wie sowas gehen kännte?
phil
-
Ich denke, über preg_replace_callback sollte sich das ganz ordentlich machen lassen. Was genau war jetzt aber deine Frage? Brauchst du Hilfe bei der Erstellung des regulären Ausdrucks?
-
preg_replace unterstützt auch den Modifier 'e', mit dessen Hilfe sich der Replace-String als PHP-Code interpretieren lässt. Macht natürlich nur dann Sinn, wenn die Parameterzahl und -anordnung immer gleich bleibt.
-
hi,
genau, der reguläre ausdruck scheint mein problem zu sein. das habe ich bisher zusammengebaut:
function parse_urls($text) { $callback=create_function('$treffer','return \'<a href="\'.tep_href_link($treffer[0], $treffer[1]).\'">\'.$treffer[2].\'</a>\';'); return preg_replace_callback("[LINK]([\d]+)\::([\d]+)\::([\d]+)[/LINK]","callback",$text); }
der reguläre ausdruck ist nicht ganz korrekt. wäre cool wenn den jemand korrigieren könnte. der rest müsste klappten, kann es nur nicht testen, weil ich diese fehlermeldung erhalte:
Warning: preg_replace_callback() [function.preg-replace-callback]: Unknown modifier
Das beispiel aus der php manuel geht aber.
Soviel kann da doch nicht falsch sein?
phil
-
Hi,
ich habe es nun geschafft, zumindest funktioniert es mit meinem beispiel. da ich meinen regulären kenntnissen nicht traue würde ich gerne wissen ob mein pattern so okay ist, oder in einigen fällen eventuell nicht funktioniert. meine links werden immer nach dem selben musster wie in der fragestellung aufgebaut.
function callback($treffer) { return "<a href='" . href_link($treffer[1], $treffer[2]). "'>" .$treffer[3]. "</a>"; } function parse_urls($text) { $pattern = "#[LINK](.*?)\::(.*?)\::(.*?)[/LINK]#"; return preg_replace_callback($pattern,"callback",$text); }
phil
-
1.) Ein regulärer Ausdruck fängt immer mit einem Delimiter an und hört damit wieder auf - z.B. mit # (du musst nur darauf achten, dass der Delimiter nicht im Pattern selbst vorkommt bzw. musst du ihn dann escapen):
#[LINK]([\d]+)\::([\d]+)\::([\d]+)[/LINK]#
Bin mir gerade nicht sicher, ob du : escapen musst, aber wenn dann beide, also :: oder \:\:
\d match nur Ziffern, was du brauchst ist wohl eher . bzw. falls dann das :: dann Probleme macht [0-9a-zA-Z] o.ä.
-
War wohl zu langsam und habe auch noch einiges vergessen - wenn dein Replace aber so recht einfach aussieht, dann reicht wohl auch das, was Dasd geschrieben hat:
$pattern = "#[LINK](.*?)\::(.*?)\::(.*?)[/LINK]#e"; $replace = "'<a href=\"'.href_link('\\1','\\2').'\">\\3</a>'"; preg_replace($pattern,$replace,$text);
Kann sein, dass noch ein Fehler drinsteckt - aber kannst es ja einfach mal testen
-
hi,
das geht soweit. ich hatte vorher meine callback funktion noch anders umgebaut:
function callback($treffer) { // Linkseite bestimmten switch ($treffer[1]) { case "FILENAME_DEFAULT": default: return "<a href='" . href_link(FILENAME_DEFAULT, $treffer[2]). "'>" . $treffer[3] . "</a>"; break; } }
Der erste Parameter stellt nämlich eine Konstante dar. Wenn ich einfach die Variable übergebe, funktioniert die Funktion href_link nicht richtig. Daher habe ich in meinem callback ein switch-case drinnen und erweiter den bei bedarf.
Gibt es denn eine Möglichkeit einen parameter nicht als wert sondern als konstante zu übergeben? weil dann könnte ich auch deinen code verwenden.
dann müsste nur die zeile:
$replace = "'<a href=\"'.href_link('\\1','\\2').'\">\\3</a>'";
irgendwie verändert werden. nur wie?
phil
-
Du kannst in href_link (oder auch schon der der Parameter-Übergabe - also in $replace) die constant() Funktion verwenden
-
jo, habs nun. besten dank.
phil
-
hi,
ich hab mir dasselbe nochmal mit einer bild url gebaut:
function parse_urls($text) { $pattern = "#[IMAGE](.*?)\::(.*?)\::(.*?)\::(.*?)\::(.*?)[/IMAGE]#e"; $replace = "'<a href=\"'.tep_href_link(constant('\\1'),'\\2').'\">" . tep_image(IMAGE_SERVER . '\\5', '\\3') . "</a>'"; $text = preg_replace($pattern,$replace,$text); return $text; }
Ist ja richtig wuselig das zusammenzuflicken. bei der funktio tep_image habe ich die konstante IMAGE_SERVER nun statisch reingebaut. Eigentlich steht diese in \\ 4 drinnen, nur wenn ich
$replace = "'<a href=\"'.tep_href_link(constant('\\1'),'\\2').'\">" . tep_image(constant('\\4') . '\\5', '\\3') . "</a>'";
nehme, kommt immer die fehlermeldung:
Warning: constant() [function.constant]: Couldn't find constant \4 in /srv/www/htdocs/domain.de/script.php on line 85
in \\4 steht aber auch IMAGE_SERVER drinnen. ich habe keine Ahnung wieso es nicht geht.
phil
-
hi,
wenn ich
$replace = "'<a href=\"'.tep_href_link(constant('\\1'),'\\2').'\">" . tep_image(constant('IMAGE_SERVER') . '\\5', '\\3') . "</a>'";
schreibe, geht es ja auch. also denke ich das der fehler nur daran liegen kann, dass ich irgendwo ein ' oder " zuviel oder zu wenig habe.
leider komme ich mit der syntax auch nicht ganz zurecht, da das replace pattern ja einen besondere aufbau hat und ich nicht mal eben wie sonst einfachen html code generieren lassen kann.
wäre echt cool, wenn da jemand nen fehler sehen könnte,
phil
-
hi,
okay, habe das ding auseinder genommen um den aufbau zu verstehen. nun läuft es endlich
hätte mir nie vorstellen können, dass es sowas gibt:
. '</a>'";
aber nun läuft es immerhin. nochmal besten dank an alle. nun habe ich es verstanden.
phil