[PHP] Teil einer URL autom. encodieren

Manimal

Angesehenes Mitglied
Hallo Ayomer,

zur Abwechslung mal wieder eine Frage von mir. Diesmal aus dem Bereich der regulären Ausdrücke.

Im der ersten Zeile des Beispiel-Code seht ihr ein von mir geschriebenen regulären Ausdruck um den "Rattenschwanz" eines Links abzugreifen und dann "urlencoden".

Das Filtern funktioniert, leider aber nicht die Nutzung von urlencode im replacement-Teil.

CODE $content = preg_replace('/"http:\/\/example.com\/click.asp\?ref=([a-z0-9&;=]*)"/i','"'.$var.'/file.php?mm=an&id=$1" class="link"',$content); // FUNKTIONIERT!

$content = preg_replace('/"http:\/\/example.com\/click.asp\?ref=([a-z0-9&;=]*)"/ie','"'.$var.'/file.php?mm=an&id='.urlencode("$1").'" class="link"',$content); // FUNKTIONIERT NICHT!


Hat jemand eine Idee wo der Fehler liegt oder kennt jemand vll eine ganz andere Möglichkeit?

An alle fleißigen Helfer voran vielen Dank!
 
In .NET ist es so, daß RegEx - Ausdrücke gesondert kompiliert werden, weil sie ja eine Art Programmiersprache darstellen.

Ich gehe davon aus, daß das in PHP ähnlich ist, weil das die Leistung massiv beeinflusst.

Damit sind aber in RegEx - Ausdrücken keine Funktionsaufrufe möglich, die erst zur Ausführungszeit ausgewertet werden.

Sprich: Du wirst das irgendwie trennen müssen.
 
Hallo Jürgen,

hatte mir schon gedacht dass du der erste bei diesem Thema bist
wink.gif


Hatte auch schon gedacht das im replacement weitere PHP Code nicht erlaubt sind. Dann habe ich aber folgendes gelesen:

QUOTE Modifier e (evaluate, execute)

Dieser Modifier gilt nur bei der Verwendung von preg_replace, in anderen PHP-Funktionen wird er ignoriert und bleibt ohne Wirkung. Ist er gesetzt, werden die Backreferences im Ersatzstring normal ersetzt, der Ersatz wird dann als PHP-Code ausgewertet, und die Rückgabe wird als eigentlicher Ersatzstring verwendet.

Quelle: http://regexp-evaluator.de/tutorial/modifier/#eval

Vielleicht verstehe ich das auch nicht richtig?
 
QUOTE (jAuer @ Mi 2.07.2008, 20:57) In .NET ist es so, daß RegEx - Ausdrücke gesondert kompiliert werden, weil sie ja eine Art Programmiersprache darstellen.

Ich gehe davon aus, daß das in PHP ähnlich ist, weil das die Leistung massiv beeinflusst.

Damit sind aber in RegEx - Ausdrücken keine Funktionsaufrufe möglich, die erst zur Ausführungszeit ausgewertet werden.

Sprich: Du wirst das irgendwie trennen müssen.

PHP hat dafür seine eigene Lösung: preg_replace_callback

Diese Methode führt eine beliebige Funktion mit den gefundenen Audrücken als Parameter aus.
 
OK, erst einmal Danke für die Denkansätze. Durch eure Hilöfe bin ich jetzt zu einem, bzw sogar zwei Ergebnissen gekommen.

CODE
$content = preg_replace('/"http:\/\/example.com\/click.asp\?ref=([a-z0-9&;=]*)"/ie',"'$var/file.php?mm=an&id='.urlencode('\\1').''",$content); // FUNKTIONIERT!

$content2 = preg_replace_callback('#\[url=(.*)\](.*)\[/url\]#Uis', 'encodeparameter', $content); // FUNKTIONIERT AUCH!



Aber welche ist nun schneller/effektiver/Ressourcen schonender?
 
QUOTE (Manimal @ Do 3.07.2008, 09:38)Aber welche ist nun schneller/effektiver/Ressourcen schonender?

Keine Ahnung. Aber es läßt sich testen:

Mache eine Schleife, in der eine Variante 1000 oder 10.000 mal ausgeführt wird und stoppe die Zeit.

Und gucke parallel dazu die CPU-Auslastung an, um zu sehen, ob eine Variante sehr CPU-lastig ist.
 
QUOTE (Manimal @ Do 3.07.2008, 10:38) OK, erst einmal Danke für die Denkansätze. Durch eure Hilöfe bin ich jetzt zu einem, bzw sogar zwei Ergebnissen gekommen.


CODE
$content = preg_replace('/"http:\/\/example.com\/click.asp\?ref=([a-z0-9&;=]*)"/ie',"'$var/file.php?mm=an&id='.urlencode('\\1').''",$content); // FUNKTIONIERT!

$content2 = preg_replace_callback('#\[url=(.*)\](.*)\[/url\]#Uis', 'encodeparameter', $content); // FUNKTIONIERT AUCH!



Aber welche ist nun schneller/effektiver/Ressourcen schonender?

Ich schätze mal das die callback langsamer ist. Die ist auch für komplexe Vorgänge gedacht.
Denn es muss ja vorher ne funktion aufgerufen werden vor dem urlencode.

Ich denke mal das es aber keinen bedeutenden Unterschied macht.
 
Zurück
Oben