Replace von URI's funktioniert nicht so wie sie soll

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

  • Replace von URI's funktioniert nicht so wie sie soll

    Hallo,

    ich habe folgende functin gefunden. Diese wandelt mir in einem Fließtext befindliches www.seite.de
    in ein <a href="http://www.seite.de~~</a> um.
    Das funktioniert ach ganz gut -> soweit.

    PHP-Code:
    function replace_links$text 
    {    
        
    $text preg_replace('#(script|about|applet|activex|chrome):#is'"\\1:"$text);
        
    $ret ' ' $text;
        
        
    // Replace Links mit http://
        
    $ret preg_replace("#(^|[\n ])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#is""\\1<a href=\"\\2\" target=\"_blank\" rel=\"nofollow\">\\2</a>"$ret);
        
        
    // Replace Links ohne http://
        
    $ret preg_replace("#(^|[\n ])((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*)#is""\\1<a href=\"http://\\2\" target=\"_blank\" rel=\"nofollow\">\\2</a>"$ret);
        
    // Replace Email Adressen
        
    $ret preg_replace("#(^|[\n ])([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i""\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a>"$ret);
        
    $ret substr($ret1);
        
        return 
    $ret;

    Jetzt hat die Sache nur einen klitze kleinen Haken.

    Wenn mein Fließtext nun ein kompletter Satz ist und und sich die URI am ENDE des Satzes befindet, dann lohnt der Besuch auf www.seite.de[COLOR="red"].[/COLOR]

    Dieser Editor hier macht es richtig. Meine Function allerdings nicht. Meine function hier nimmt den letzten PUNKT mit. Was zur Folge hat, dass der Link nachher nicht mehr funktioniert.
    Meine Wissen über reguläre Ausdrücke hört genau hier auf um mir selbst helfen zu können. Weis jemand wie ich das Letzte Zeichen verbiete wenn es sich um einen (.) handelt!?
    PHP 8.0, MariaDB 10.5 auf U20.04

  • #2
    Zitat von SusiSorglos Beitrag anzeigen
    Weis jemand wie ich das Letzte Zeichen verbiete wenn es sich um einen (.) handelt!?
    Da der Punkt ein Zeichen mit Sonderfunktion ist, musst du ihn maskieren ("escapen"). Das macht man mit einem vorangestellten Backslash, also so:
    PHP-Code:
    '/\./'
    Wahlweise geht das auch, indem man seinen ASCII-Wert direkt in hexadezimaler Schreibweise notiert:
    PHP-Code:
    '/\x2e/' 
    Das Einsammeln der Zeichen würde ich aber nicht an jedem Punkt abbrechen, sondern nur an "Punkten", die als Satzzeichen dienen. Andernfalls würden korrekte URLs wie https://en.wikipedia.org/wiki/.de durchs Raster fallen. Und neben dem Punkt gibts noch eine ganze Menge anderer Satzzeichen, die am Ende einer URL stehen können und zu dieser gehören können, aber nicht müssen, wie bspw. Komma oder schließende Klammern.

    Daher ist der Einbau einer solchen Abfrage in deine preg_replace()-Kaskade schwierig. Generell würde ich dir raten, besser auf fertige Libraries (beispielsweise aus einem Wiki- oder BBCode-Parser) zurückzugreifen. Die kümmern sich dann auch um das korrekte Escaping für URL-Bestandteile und in HTML eingebetteten Text. Beides hast du vergessen. Allerdings würde das mit einfachen preg_replace()-Aufrufen auch nicht funktionieren, nur mit preg_replace_callback().
    Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

    Kommentar

    Lädt...
    X