2012-04-14 4 views
3

im Kommentarbereich auf einer Website. Zuerst brauchte ich einen regulären Ausdruck zu tun, dass jede URL findet, und ersetzen Sie es mitUrl Regex für preg_replace, aber ohne die URLs innerhalb der BBCode [url]

umgeben
<a href="url"></a> 

So fand ich einen Super regulären Ausdruck alle URLs in einem Kommentar zu finden, und ich habe eine Funktion, die alle kehrt die URLs mit dem HTML-Tag:

function addURLTags($string) { 
    $pattern = "/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))/"; 
    return preg_replace($pattern, '<a href="$1">$1</a>', $string); 
} 

Alles ging ausgezeichnet. Aber vor einer Woche hat mir mein Chef gesagt, dass ich jetzt BBCode in den Kommentarbereich einfügen muss. Und ich war wie "kein Problem" ... aber dann hat er mir gesagt, dass meine Funktion addURLTags bleiben soll.

So eine Zeichenfolge wie folgt:

http://www.google.com 
[url]http://www.google.com[/url] 
[url="http://www.google.com"]http://www.google.com[/url] 

müssen auf die gleiche Zeichenfolge ersetzt werden:

<a href="http://www.google.com">http://www.google.com</a> 

Also habe ich ein wenig PHP-Bibliothek, die alle bbcode ocurrences zu HTML-Code ersetzt.

Und ich dachte: „Ok, erste sollte ich alle url ocurrences erhalten, die keine [url] Tag in beggining tun und zweite ersetze ich alle bbcode Tags“

Und ich versuchte, Fügen Sie am Anfang der Superregex eine negative Assertion hinzu:

/(? i) \ b ((?! [url]) (?: https?: // | www \ d {0, 3} [.] | [A-z0-9 .-] + [.] [Az] {2,4} /) (?: [^ \ S() <>] + | (([^ \ s () <>] + | (([^ \ s() <>] +))) )) + (?: ([^ \ S() <>] + | (([^ \ s() < >] +)))) | [^ \ s`!]() [] {};: '\ "., <>?« »" "' '']))/

aber hat nicht funktioniert!

Ich bin irgendwie Neuling mit regulären Ausdrücken und alle Online-Tester, die ich versuchte, funktionieren nicht gut mit so einem langen Regex. Ich weiß nicht, was ich noch versuchen soll.

Haben Sie Vorschläge? Kennen Sie irgendeine PHP-Bibliothek, die die "URL-Ersetzung" mit und ohne die [url] bbcode-Tags durchführt?

Vielen Dank im Voraus.

Antwort

1

Sie lösen hier zwei Probleme. Also löse sie separat und lösche nicht alles in einen einzigen regulären Ausdruck, der die Dinge mehr oder weniger komplizierter macht als weniger.

Divide and Conquer:

zuerst Ihre bbcode Bibliothek verwenden, um die Teile zu finden, wo diese URLs sind, so dass man einen Strom von Ihrem Text erstellen:

"normal text", "bbcode", "normal text", "bbcode" 

Dann bewerben Sie die bbcode Bibliothek um die URLs nur in den "BBCode" -Segmenten zu erstellen, und Ihre URL clickable-maker wird nur auf die "normalen Textsegmente" angewendet.

Nachdem alle Segmente verarbeitet wurden, verketten Sie alle zurück in eine Zeichenfolge.

Voila, Problem gelöst.

+0

Ich konzentrierte mich so sehr auf meine Art, dass ich die ganzen Möglichkeiten nicht sehen konnte. Ich habe die Kommentarzeichenfolge aufgeteilt und alle Zeichenfolgen des BBCode gespeichert. dann sende ich alle diese an die bbcodelibrary. Der Rest der Saiten funktionierte ok mit dem Super Regex. perfekt. ich danke dir sehr! –

0

Es ist besser, zuerst die BBCodes [url] zu parsen und dann alle leeren URLs in Links umzuwandeln. Dies kann leicht erreicht werden, indem ein negatives Lookbehind verwendet wird, um sicherzustellen, dass vor der URL kein doppeltes Anführungszeichen vorhanden ist. Dies funktioniert, weil Sie die Anführungszeichen in der ursprünglichen Zeichenfolge bereits in &quot; umgewandelt haben sollten. Daher müssen alle tatsächlichen Anführungszeichen vor einer URL als Teil des Link-Erstellers eingefügt worden sein.