Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] preg_replace(): nur jeder 2. Durchlauf greift wegen Leerzeichen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] preg_replace(): nur jeder 2. Durchlauf greift wegen Leerzeichen

    Hi,

    ich wollte meine Linkerkennung noch mal überarbeiten und etwas kompakter gestalten. Da bin ich auf diese Variante gekommen:
    PHP-Code:
    <?php
    $post_input 
    'www.domain1.de www.domain2.de www.domain3.de';
    $text ' ' htmlspecialchars($post_inputENT_QUOTES'UTF-8') . ' ';
    $text preg_replace('#([[:space:]])((?>(?>ht|f)tps?://|www\.)[^[:space:]]+?)([[:space:]])#i''$1<a href="$2" target="_blank">$2</a>$3'$text);
    echo 
    $text;
    ?>
    Dabei kann ich mir nicht erklären, warum domain2.de nicht verlinkt wird. Es wirkt, als würde das auf die URL folgende Space durch den vorherigen Patterndurchlauf reserviert. Kann ich das irgendwie verhindern / umgehen?

    Was ich dann wieder faszinierend finde ist, dass das auch nicht geht:
    PHP-Code:
    '#(^|[[:space:]e])((?>(?>ht|f)tps?://|www\.)[^[:space:]]+?)([[:space:]w])#i' 
    Ich kann also weder auf den Anfang der Zeile zugreifen, noch auf das "e" aus ".de" oder das "w" aus "www", noch auf Spaces. Rein gar nichts greifbar.

    Lasse ich den Pattern auf dem "e" enden, dann läuft er durch (nur ohne das "e" ):
    PHP-Code:
    '#([[:space:]])((?>(?>ht|f)tps?://|www\.)[^[:space:]]+?)([[:space:]e])#i' 
    So als bräuchte der Durchlauf ein Zeichen Platz um zu funktionieren ?!

    Das bestätigt auch die Tatsache, dass ich mit dem String alles verlinkt bekomme (zwei Leerzeichen zwischen den URLs):
    PHP-Code:
    $post_input 'www.domain1.de  www.domain2.de  www.domain3.de'
    EDIT:
    Hmm ich glaube ich verstehe die Logik. Der Pattern sucht nicht quasi in einer Schleife, sondern der zerlegt den ganzen String auf einmal mit dem übergebenen Filter. Hmm.. blöd. Dann muss ich doch mit Stoppzeichen arbeiten.

    EDIT2:
    Doch nicht. Geht auch einfacher. Vor lauter Bäumen...
    PHP-Code:
    '#([[:space:]])((?>(?>ht|f)tps?://|www\.)[^[:space:]]+)#i' 
    meine PHP Scripte

Lädt...
X