preg_replace() weigert sich standhaft...

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

  • preg_replace() weigert sich standhaft...

    ... zu machen, was ich von ihm will ;-)

    Altbekanntes Prblem: URL umwandeln.

    Mein Code:

    Code:
    $inhalttemp=preg_replace("=(^|\ |\n)(http:\/\/|http:\/\/www\.)
    ([a-zA-Z0-9\.\/-\_]{1,})=i","\1<a href=\"\2\3\" target=\"_blank\">\2\3</a> "
    ,$inhalttemp);
    Was er daraus macht:

    

    Doofer Computer !!! Findet von euch einer meinen Fehler ?

    EDIT:
    Ich hab die beiden brakes im Code mal eingefügt, damit mans besser lesen kann ...
    Yeah !

  • #2
    Hm. Poste mal bitte ein Beipsiel bei dem der Fehler auftritt. Den bei mir hats funktioniert.

    Bei \1 \2 und \3 muß du noch jeweils ein \ hinzufügen. - bei mir kam eben auch ein:  als ich bei \1 vergessen hatte den Slash einzufügen.

    Also:

    \\1

    Oder so:

    PHP-Code:
    $inhalttemp=preg_replace("=(^|\ |\n)(http:\/\/|http:\/\/www\.)([a-zA-Z0-9\.\/-\_]{1,})=i","$1<a href=\"$2$3\" target=\"_blank\">$2$3</a> ",$inhalttemp); 
    Grüsse,
    Sebastian


    Profil Flex Freelancer
    Twitter twitter.com/flashhilfe
    Web Flash und Flex Community

    Kommentar


    • #3
      Woa, der geht ... ich werd verrückt, der geeeeht ;-)

      Tausend Dank - ich versteh zwar nicht, wieso das so ist - aber was soll's *gg*
      Yeah !

      Kommentar


      • #4
        preg optimized

        Langeweile ... ich hab mal alle möglichen Verbesserungen eingebaut:

        1. % als delimiter statt = (das = wird gleich anderweitig gebraucht)
        2. aus der ersten Klammer eine positive lookbehind-assertion machen
        (?<=(^|\s)) ... \s steht für Blanks aller Art
        3 da du den Modifier i dabei hast, können die Großbuchstaben weg
        4 [0-9] abkürzen mit \d
        5. {1,} lässt sich einfacher mit + schreiben

        6. Backslashes eliminieren - macht das Ganze übersichtlicher. Folgende Zeichen müssen nicht escaped werden:
        a) / wird nicht als Delimiter benutzt
        b) Underscore
        c) der Punkt in einer Zeichenklasse
        d) Minus, wenn es am Anfang einer Zeichenklasse steht
        ergo: %(?<=(^|\s))(http://|http://www\.)([-a-z\d._]+)%i

        7. nu noch das www. raus, ist ja schon mit der Zeichenklasse abgehandelt; und es wird nur noch ein Subpattern für die gesamte URL benötigt:
        (http://[-a-z\d./_]+)
        8. den replace-String mit einfachen Anführungszeichen begrenzen und mit $ arbeiten (spart noch ein paar Backslashes)

        PHP-Code:
        $inhalttemp=preg_replace(
          
        "%(?<=(^|\\s))(http://[-a-z\\d./_]+)%i",
          
        '<a href="$2" target="_blank">$2</a>',
          
        $inhalttemp
        ); 
        mein Sport: mein Frühstück: meine Arbeit:

        Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

        Kommentar


        • #5
          ...

          Aber dann auch noch (\w statt a-z_):


          $inhalttemp=preg_replace(
          "%(?<=(^|\s))(http://[-\w\d./]+)%i",
          '<a href="$2" target="_blank">$2</a>',
          $inhalttemp
          );


          Oder nicht?
          Zuletzt geändert von Sebastian W; 26.02.2004, 11:06.
          Grüsse,
          Sebastian


          Profil Flex Freelancer
          Twitter twitter.com/flashhilfe
          Web Flash und Flex Community

          Kommentar


          • #6
            Wenn Dir echt langweilig ist, dann folgendes:

            Mein Wordwrap bricht eine Zeichenfolge über 60 Zeichen um - was dazu führt, daß eine url über 60 Zeichen unbrauchbar wird.

            Bin gespannt und höre bis zu Deiner Antwort erstmal auf, daran rumzubasteln
            Yeah !

            Kommentar


            • #7
              Ich hatte das mal so gelöst:
              Code:
              function wrap($url){
              	return "<a href='".$url."'>".wordwrap($url, 60,"<br>",1)."</a>";
              }
              $text = preg_replace('/(http:\/\/[-@\w.\/?=&%+~#:]*[\w\/])/ei','wrap("$1")', $text);
              @ Titus:
              Der RegEx ist alt und nicht überarbeitet. - falls du nen Fehler finden solltest ))


              Nachtrag:
              Argh, das dieses Forum immer die \ verschlucken muß...'*'#&*§
              Zuletzt geändert von Sebastian W; 26.02.2004, 11:23.
              Grüsse,
              Sebastian


              Profil Flex Freelancer
              Twitter twitter.com/flashhilfe
              Web Flash und Flex Community

              Kommentar


              • #8
                Argh, das dieses Forum immer die \ verschlucken muß...'*'#&*§
                bei den [code-tags] gehts ...
                Die Zeit hat ihre Kinder längst gefressen

                Kommentar


                • #9
                  Ah ok. Danke.
                  Grüsse,
                  Sebastian


                  Profil Flex Freelancer
                  Twitter twitter.com/flashhilfe
                  Web Flash und Flex Community

                  Kommentar


                  • #10
                    Original geschrieben von Sebastian W
                    Aber dann auch noch (\w statt a-z_):
                    ...
                    Oder nicht?
                    \w gibt u.U. Probleme je nach localization ... z.B. gehören in Deutschland auch äöüß dazu; darum verzichte ich lieber drauf.

                    http://php-resource.de/manual.php?p=pcre.pattern.syntax
                    \w
                    any "word" character
                    \W
                    any "non-word" character

                    A "word" character is any letter or digit or the underscore character, that is, any character which can be part of a Perl "word". The definition of letters and digits is controlled by PCRE's character tables, and may vary if locale-specific matching is taking place (see "Locale support" above). For example, in the "fr" (French) locale, some character codes greater than 128 are used for accented letters, and these are matched by \w.
                    mein Sport: mein Frühstück: meine Arbeit:

                    Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

                    Kommentar


                    • #11
                      Ach so. Ok.
                      <- wieder was gelernt

                      Danke.
                      Grüsse,
                      Sebastian


                      Profil Flex Freelancer
                      Twitter twitter.com/flashhilfe
                      Web Flash und Flex Community

                      Kommentar


                      • #12
                        titus, vlt kannst du kurz erläutern was dein lookbehind - dings macht
                        ganz raff ich diese dinger immer noch ned ..

                        danke schonmal
                        mfg,
                        [color=#0080c0]Coragon[/color]

                        Kommentar


                        • #13
                          Das sieht wilder aus als es ist

                          -> http://www.regenechsen.de/regex_de/regex_liste_de.html
                          Grüsse,
                          Sebastian


                          Profil Flex Freelancer
                          Twitter twitter.com/flashhilfe
                          Web Flash und Flex Community

                          Kommentar

                          Lädt...
                          X