[Funktion] BBCode Problem mit http://

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

  • [Funktion] BBCode Problem mit http://

    In meiner BBCode Funktion sind folgende Zeilen enthalten:

    PHP-Code:
      // [url][/url]
      
    $str preg_replace('=\[url\]\s*(.*?)\s*\[/url\]=ie''"<a href=\"$1\" target=\"_blank\">$1</a>"'$str);
      
    $str preg_replace('=\[url\s*\=\s*(.*?)\s*\]\s*(.*?)\s*\[/url\]=ie''"<a href=\"$1\" target=\"_blank\">$2</a>"'$str); 
    Wenn man nun den geparsten Code <a href="xyz" target="_blank">Text</a> hat, soll jedoch der Wert des href-Parameters (xyz) mit blabla:// (also: ftp:// http:// https:// irc:// etc.) anfangen. Wenn er nicht mit so etwas anfangen soll, dann sollte ein http:// davorgefügt werden, ansonsten sollte er so gelassen werden.

    Ich habe leider keine Ahnung, wie ich das Ganze in den Code umsetzen soll. Ich hoffe, ihr könnt mir weiterhelfen.
    [color=red]Meine Seite:[/color]
    American-Dad.de

  • #2
    ... soll jedoch der Wert des href-Parameters (xyz) mit blabla:// (also: ftp:// http:// https:// irc:// etc.) anfangen
    das "blabla" heißt protokoll und das "href" - attribut.
    Wenn er nicht mit so etwas anfangen soll, dann sollte ein http:// davorgefügt werden, ansonsten sollte er so gelassen werden.
    das müsstest du mit einem weiteren preg_match abfragen ("wenn ein doppelpunkt in der url vorkommt, wurde das protokoll angegeben. sonst: füge http hinzu").

    Kommentar


    • #3
      Ich habe nun deinen Rat zu Herzen genommen, doch irgendwie ändert das nicht an dem geparsten Text. Hier ist mein PHP Code:

      PHP-Code:
        // [url][/url]
        
      $str preg_replace('=\[url\]\s*(.*?)\s*\[/url\]=ie''"<a href=\"$1\" target=\"_blank\">$1</a>"'$str);
        
      $str preg_replace('=\[url\s*\=\s*(.*?)\s*\]\s*(.*?)\s*\[/url\]=ie''"<a href=\"$1\" target=\"_blank\">$2</a>"'$str);
        if(!
      preg_match('=\<\s*a\s+href\s*\=\s*"(.+?):\/\/"\s*(.*?)\s*>\s*(.*?)\s*\<\s*\/\s*a\>=ie'$str)) {
          
      $str preg_replace('=\<\s*a\s+href\s*\=\s*"(.+?):\/\/(.*?)"\s*(.*?)\s*>\s*(.*?)\s*\<\s*\/\s*a\>=ie''"<a href=\"http://$2\"$3>$4</a>"'$str);
        } 
      Es muss wohl irgendwo im preg_match ein fehler sein, sonst müsste es doch gehen. Nur wo ist er?
      [color=red]Meine Seite:[/color]
      American-Dad.de

      Kommentar


      • #4
        eine callback funktion würde sich hier empfehlen, die den string auf ":" untersucht und evtl. eine entscheidung über die ergänzung trifft.

        Kommentar


        • #5
          Das Problem ist: Der ganze Text ist in der Variable $str enthalten. Wenn man jetzt fragt, ob da ein Doppelpunkt ( vorkommt, dann wird das Ergebnis höchstwahrscheinlich positiv sein, auch wenn es nicht in der Adresse vorkommt.
          [color=red]Meine Seite:[/color]
          American-Dad.de

          Kommentar


          • #6
            unsinn, deine patterns berücksichtigen nur bb-tags.

            Kommentar


            • #7
              Tut mir leid, ich bin leider auch nicht so ein geübter PHP-Coder und kann mir zurzeit überhaupt nicht vorstellen, wie du das meinst. Könntest du evtl. bitte ausnahmsweiße einen Code posten, wie man das lösen könnte? Mein Gehirn ist zurzeit schon ziemlich überlastet.
              [color=red]Meine Seite:[/color]
              American-Dad.de

              Kommentar


              • #8
                http://de3.php.net/manual/en/functio...e-callback.php

                Kommentar


                • #9
                  Original geschrieben von penizillin
                  http://de3.php.net/manual/en/functio...e-callback.php
                  Danke. Ich habe nun eine Lösung gefunden.
                  [color=red]Meine Seite:[/color]
                  American-Dad.de

                  Kommentar


                  • #10
                    zeig mal

                    Kommentar


                    • #11
                      PHP-Code:
                        // [url][/url]
                        
                      $str preg_replace('=\[url\]\s*(.*?)\s*\[/url\]=ie''"<a href=\"$1\" target=\"_blank\">$1</a>"'$str);
                        
                      $str preg_replace('=\[url\s*\=\s*(.*?)\s*\]\s*(.*?)\s*\[/url\]=ie''"<a href=\"$1\" target=\"_blank\">$2</a>"'$str);
                        
                      $str preg_replace_callback('|<\s*a\s+href\s*=\s*"(.*?)"\s*(.*?)\s*>(.*?)\<\s*/a\s*\>|i'"protocol_replace"$str); 
                      PHP-Code:
                        function protocol_replace($matches) {
                          if(
                      preg_match('|\w+://|'$matches[1])) {
                              return 
                      '<a href="'.$matches[1].'" '.$matches[2].'>'.$matches[3].'</a>';
                          } else {
                              return 
                      '<a href="http://'.$matches[1].'" '.$matches[2].'>'.$matches[3].'</a>';
                          }
                        } 
                      [color=red]Meine Seite:[/color]
                      American-Dad.de

                      Kommentar


                      • #12
                        sehr gut. aber was ist mit diesem link:
                        Code:
                        [ url]www.example.com?url=http://example.com[/url ]

                        Kommentar


                        • #13
                          Stimmt. Nur was kann man dagegen tun?
                          [color=red]Meine Seite:[/color]
                          American-Dad.de

                          Kommentar


                          • #14
                            in dem pattern fordern, dass das protokoll am anfang der url erwartet wird.

                            Kommentar


                            • #15
                              Wie wäre es, wenn man . durch w austauscht?
                              [color=red]Meine Seite:[/color]
                              American-Dad.de

                              Kommentar

                              Lädt...
                              X