Problem mit RegExp (BBCode-Parser)

MonGol1992

Mitglied
Hallo Leute!

Ich hab mit ne Funktion gebastelt, die mir BBCode in HTML umwandelt (so ähnlich wie in einem der Tutorials hier). Nur leider hat diese Funktion nen Bug:
Wenn folgendes übergeben wird:

http://dom.tldhttp://dom1.tld


dann wird jedoch folgendes zurückgegeben:


<a href="http://dom.tld[/url]http://dom1.tld">http://dom.tld[url]http://dom1.tld</a>



Hier der nötige Auszug der Funktion:
PHP:
$text = preg_replace("~\[url\](.*)\[\/url\]~i", "<a href=\"$1\">$1</a>", $text);
So. Da ich ein bisschen experimentierfreudig bin, hab ich folgendes mal ausprobiert, was aber leider nicht funktionierte (der reg. Ausdruck wurde erst gar nicht "gefunden"):
PHP:
$text = preg_replace("~\[url\](.*)([^\[url\](.*)\[\/url\]])\[\/url\]~i", "<a href=\"$1\">$1</a>", $text);

Sorry, aber in Sachen RegExp bin ich nicht so 100% fitt wie in anderen Dingen.

MfG,
Marcel
 
Reguläre Ausdrücke sind von Natur aus gierig. Das heißt quantifizierte Ausdrücke passen immer auf die größte mögliche Übereinstimmung auch wenn es kleinere Übereinstimmungen gibt.
In deinem Fall ist es das .*, das dafür verantwortlich ist, dass alles zwischen dem ersten [url] und [/url] als Übereinstimmung gezählt wird. Ein Fragezeichen hinter diesem Ausdruck sorgt dafür, dass die kleinste Übereinstimmung gewählt wird.
Code:
~\[url\](.*?)\[\/url\]~i
Der „U“-Modifikator sorgt übrigens für dasselbe Verhalten, allerdings dann auch für alle vorkommenden Quantoren.
Code:
~\[url\](.*)\[\/url\]~iU
 
Ich hätte es so gemacht denn so ist es sicherer ;)

PHP:
<?php

$url = '[ url]www.google.de[ /url]';
$urlco = '/\[ url\](.*)\[\ /url\]/i';

$regex0 = preg_match($urlco, $url);
$regex01= $regex0 ? preg_replace($urlco, "$1",$url);
$regex1 = preg_match('/^http\:\/\//i', $regex01);
$regex2 = preg_match('/^www\./i', $regex01);

if($regex0 && ($regex1 || $regex2)) {

$urlc = $regex2 ? 'http:\\'.$regex01 : '';
$urlc = $regex1 ? $regex01 : $urlc;

$text .= $urlc;

}
?>
 
Zuletzt bearbeitet:
Das hat aber doch gar nichts mit dem von Marcel geschilderten Problem zu tun, dass das Suchmuster vom ersten [url] bis zum letzten [/url] als Übereinstimmung wertet.
 
Ich meine ja nur, bei dem was ich da geschrieben habe, überprüft er auch ob ein http:// davor is und so und bei ihm ist alles zu frei. :)
 
Und warum dafür umständliche RegExp nehmen, wenn [phpf]strpos[/phpf] dafür wahrscheinlich schneller ist?

Jetzt ist natürlich die Frage, was ist, wenn es eine FTP URI ist?
Oder wenn es kein www gibt, sondern es eine Subdomain ist?
Diese Fälle hast du nun wieder nicht bedacht... ;)
 
Und warum dafür umständliche RegExp nehmen, wenn [phpf]strpos[/phpf] dafür wahrscheinlich schneller ist?

Jetzt ist natürlich die Frage, was ist, wenn es eine FTP URI ist?
Oder wenn es kein www gibt, sondern es eine Subdomain ist?
Diese Fälle hast du nun wieder nicht bedacht... ;)

nunja da hast du natürlich recht :D Man könnte es ja mit strpos machen genauso wie du meintest, aber wenn ich z.B selbst meine eigenen scripts erstelle dann wäre es besser wenn man seinen eigenen weg findet weil man dann 1. mehr lernt und viel wichtiger 2. vielleicht auch der eigene weg besser ist als die alternative.... :)
 
Zurück