preg_replace() weigert sich standhaft...

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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

    Comment


    • #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 !

      Comment


      • #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.

        Comment


        • #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?
          Last edited by Sebastian W; 26-02-2004, 11:06.
          Grüsse,
          Sebastian


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

          Comment


          • #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 !

            Comment


            • #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ß...'*'#&*§
              Last edited by Sebastian W; 26-02-2004, 11:23.
              Grüsse,
              Sebastian


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

              Comment


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

                Comment


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


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

                  Comment


                  • #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.

                    Comment


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

                      Danke.
                      Grüsse,
                      Sebastian


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

                      Comment


                      • #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]

                        Comment


                        • #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

                          Comment

                          Working...
                          X