PHP :: Reguläre Ausdrücke :: Problem



  • Hallo, ich habe mir folgenden regulären Ausdruck (preg_replace) geschrieben:

    $message=preg_replace('~(http\:\/\/).([0-9a-zA-Z\.\-_\/\?\&\%]{1}))~',"<a href=\"//1\">//1</a>",$message);
    

    Sinn ist es, dass Webadressen automatisch in Links umgewandelt werden. Nur, wie sich einige bestimmt schon denken können, funktioniert dieser Ausdruck so nicht. Ich bekomme nichts zurück, nur einen leeren String. Was mache ich falsch?

    - Windoof



  • Versuch es mal so:

    $message=preg_replace('~(http\:\/\/)([0-9a-zA-Z\.\-_\/\?\&\%]*)~',"<a href=\"\\1\">\\1</a>",$message);
    

    Ist allerdings nicht getestet. Damit du die Änderungen nicht suchen musst: Punkt zwischen den 2 Klammern weg und aus {1} ein * gemacht. Des weiteren ist hinten, wenn ich richtig gezählt habe, eine Klammer zu viel. Außerdem greift man über \\1 auf die gematchten Ausdrücke zu.

    Allerdings wird dein Ausdruck nicht richtig funktionieren, wenn ein Satzzeichen wie . oder ? nach der URL kommt - außerdem können afaik auch Kommas in URLs vorkommen 😉



  • Ja, gut... damit kann ich leben, Kommas kann man noch hinzufügen, baer \\1 ist bei mir dabei leer, ansonsten funktioniert der Ausdruck a sich... aber wie gesagt: nun habe ich keine URL mehr... bzw. nur http:// ohne etwas danach.

    EDIT: *omg* - \\2 gibts ja ooch noch ^^ sorry. Danke dir. so funktioniert's:

    $message=preg_replace('~(http\:\/\/)([0-9a-zA-Z\,\.\-_\/\?\&\%]*)~',"<a href=\"\\1\\2\">\\1\\2</a>",$message);
    


  • Vielleicht noch 'ne andere Frage: Ich hab ja ein Gästebuch, und da werden URLs quasi jetzt umgewandelt. Allerdings habe ich aucheine Funktion geschrieben:

    function trim_long_words($txt,$len)
    {
      $txt=str_replace("<br>","<br> ",$txt);
      $a=explode(" ",$txt);
      for($i=0;$i<count($a);++$i)
        for($j=0;$j<strlen($a[$i]);++$j)
          if($j%$len==0)
            $a[$i]=substr($a[$i],0,$j)." ".substr($a[$i],$j,strlen($a[$i]));
      return str_replace("<br> ","<br>",implode(" ",$a));
    }
    

    Frage hierzu: URLs sollen natürlich nicht zerschnitten werden, wie kann ich das machen?`

    Und dann wäre noch wünschenswert, wenn eine URL zu lang ist, dort die ersten paar Zeichen, ... und die letzten zeichen anzuzeigen, also etwa sowas hier:

    http://ganzganzganzganzlangeurl.com/ -> http://gan...geurl.com/

    OK, letzteres sollte ich noch selbst packen, aber das davor... k.a. wie ich das anstellen soll.

    EDIT: Verdammt... ich kann auf die tatsächliche Länge von \\1\\2 nicht zugreifen, stattdessen wird mir 6 ausgegeben... dh. ich komm mit letzterem Punkt doch nicht klar... kann mir da einer helfen?


  • Mod

    Schau dir mal den e modifier an



  • EDIT: Cool, danke, hat mir beim letzten Problem schonmal geholfen, jetzt ist nurnoch das Problem mit dem trim_long_words...



  • @Windoof

    Die Website in deinem Anhang funktioniert nicht!



  • lol... warte mal 10 sekunden ab ^^ oder klick auf aktualisieren oder auf netzwerkeinstellungen oder auf zurück... 😉

    EDIT: Und lies dir die "Fehlermeldung" auch mal durch: "Die Seite will nicht angezeigt werden." Also wer das für eine echte Fehlermeldung hält...





  • Hmm... ne, das hilft mir nicht, weil:

    ich will Wörter umbrechen, die zu lang sind: Ja
    ich will URLs umbrechen, also http://www.gaaaaaaaaaaanz-lange-url.de/ : Nein.

    Und diese Funktion würde aber beides oder garnichts von beidem umbrechen.



  • Was kann denn txtallesenthalten(bzgl.Tagsusw.)?for(txt alles enthalten (bzgl. Tags usw.)? for(i=0;i<count(i<count(a);++i) <-- hier besser foreach for(j=0;j<strlen(j<strlen(a[i]);++j) <-- warum gehst du jeden Buchstaben einzeln durch ???



  • Nunja... no comment 😃 Na sag du mir, wie ich das machen soll, ich bin hier ja derjenige, der keine Ahnung hat :p Aber es muss so sein, dass bei

    http://www.url.com/folder/file.php?param=value&param2=value2

    und bei

    http://www.newssite.com/articles/05/02/01,8,50,23.htm

    nichts zerstückelt wird, aber bei

    loooooooooooooooooooooooooooooooooooooooooooooooooooool

    schon. Das ist mein Problem. Ich wieß, dass man das wirgendwie mit regulären Ausdrücken machen muss, aber ich weiß nicht wie ich das anstellen soll...



  • ist denn jetzt dein $txt Plain-Text, oder schon HTML-Code?!
    Wenn du z.B. zuerst htmlspecialchars über den String laufen lässt, dann mit deinem preg_replace die URLs durch Tags ersetzt und die "Anzeige-URL" ggf. entsprechend kürzt, dann kannst du nachher einfach dein explode machen. Wenn dann das erste Zeichen eines Elements ein < ist, dann weißt du, dass es sich um eine URL handelt und gehst einfach weiter zum nächsten Element.
    Oder du machst einfach wieder ein preg_replace und suchst Strings mit z.B. mehr als 50 Zeichen, dia aber nicht in < > eingeschlossen sind 🙂



  • $message=str_replace("\\\\","\\",$message);
       $message=str_replace("\\'","'",$message);
       $message=str_replace("\\\"","\"",$message);
       $message=get_short($message,512);
    //   $message=trim_long_words($message,38);
    
    // Plain Text, außer Zeilenumbrüche
    
       $message=preg_replace('~(http\:\/\/)([0-9a-zA-Z\,\.\-_\%\/]*)([0-9a-zA-Z\,\.\-_\%\&\?\=\/]*)~e',"'<a href=\"\\1\\2\\3\" title=\"\\1\\2\\3\" target=\"_blank\">'.get_short('\\2',36).'</a>'",$message);
    
    // Links evtl. enthalten
    

    Es kommt drauf an, wo man es durchlaufen lassen will.



  • Hast du mit meiner Vorgehensweise jetzt etwas anfangen können - oder was genau ist jetzt noch deine Frage?! 🙄


Anmelden zum Antworten