preg_replace nicht in links

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

  • preg_replace nicht in links

    Hi Leute,

    hab ein kleines Problem beim preg_replacing.

    Ich will einen in einem Text bestimmte Wörter durch einen Link erstetzen.
    Die Wörter lade ich aus einer Datenbank und lasse das preg_replace in einer Schleife laufen.
    Findet er eines dieser Wörter in dem Text, soll er es durch einen Link erstzen.
    So sieht mein code aus:
    PHP-Code:
    $text preg_replace(" /$row[name]/i","<a href=\"$row[link].htm\">\\0</a>",$text,1); 
    Funktioniert soweit ganz gut, nur entsteht dabei ein Problem:
    Findet er ein Wort in einem vorher bereits ersetzen Wort, so fügt er hier auch einen Link ein, was im Endeffekt so aussieht:

    <a href="xxx">super<a href="yyy">klasse</a>wort</a>

    und sowas sieht der Browser gar nicht gerne

    Jetzt brauche ich nur einen Ausdruck, der verhindert, dass zwischen den a-tags ersetzt wird. also zwischen "<a" und "a>" soll nichts ersetzt werden.

    Ich hoffe, ihr wisst da mehr als ich oder könnt mir wenigstens einen rat geben
    arrays sind klasse

  • #2
    (?!xxx)
    Negiert das angegebene Pattern und wirkt sich auf das vorangehende aus.

    Beispiel: /text1(?!text2)/

    Trifft auf eine Zeichenkette zu, die "text1" enthält, aber kein "text2" danach.

    (?<!xxx)
    Negiert das angegebene Pattern und wirkt sich auf das nachfolgende aus.

    Beispiel: /(?<!text1)text2/

    Trifft auf eine Zeichenkette zu, die "text2" enthält, aber nur, wenn "text1" nicht davor kommt.

    Kommentar


    • #3
      Danke, aber das kann so nicht klappen, da $row[name] den ganzen Text darstellt und nicht durch leerzeichen getrennte teile.

      oder irre ich mich da? meine versuche gingen jedenfalls schief
      arrays sind klasse

      Kommentar


      • #4
        Original geschrieben von TobiaZ
        Beispiel: /(?<!text1)text2/

        Trifft auf eine Zeichenkette zu, die "text2" enthält, aber nur, wenn "text1" nicht davor kommt.
        wenn text1 jetzt dein <a href="..."...> wäre, dann sollte das doch passen ...? (und dahinter noch auf !</a> prüfen, klar. und maskieren von sonderzeichen nicht vergessen ...)
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          stimmt, ich hab da blödsinn geschrieben. hab es einfach nur falsch gemacht
          danke für eure hilfe.
          arrays sind klasse

          Kommentar


          • #6
            Hab es bis jetzt halbwegs hinbekommen:
            /$gwrow[name](?!.*a\>)/i

            Diese Lösung ist nur etwas schlecht, weil Wörter nicht mehr durch Links ersetzt werden, wenn sie im Text vor anderen Links stehen.

            Wie kann ich dieses pattern abgrenzen, so dass wirklich nur zwischen <a und a> nichts ersetzt wird, sonst überall schon ?

            /(?<!\<a.*)$gwrow[name](?!.*a\>)/i

            will nicht klappen
            arrays sind klasse

            Kommentar


            • #7
              PHP-Code:
              /(?<!\<a.*)$gwrow[name](?!.*a\>)/
              ich kann mir irgendwie nicht vorstellen, daß die die vars, speziell das feld, so erkannt(umgesetzt) werden ...

              könntest du mal ein konkretes beispiel und ein gegenbeispiel posten, ... dann kann man bestimmt was basteln ...
              Die Zeit hat ihre Kinder längst gefressen

              Kommentar


              • #8
                Gut, sagen wir das ist der Text:
                "Hallo, das ist ein super Forum mit vielen ultrasuperwörtern."

                Die Wörter, die durch Links ersetzt werden sollen sind (in dieser Reihenfolge):
                "ultrasuperwörtern", "super", "Forum"

                Das ganze in ner Schleife.

                Am Ende soll das hier rauskommen:
                "Hallo, das ist ein <a href="x">super</a> <a href="x">Forum</a> mit vielen <a href="x">ultrasuperwörtern</a>."

                Sieht das pattern so aus:
                /$gwrow[name]/i

                passiert das:
                "Hallo, das ist ein <a href="x">super</a> <a href="x">Forum</a> mit vielen <a href="x">ultra<a href="x">super</a>wörtern</a>."

                Sieht das pattern so aus:
                /$gwrow[name](?!.*a\>)/i

                passiert das:
                "Hallo, das ist ein super Forum mit vielen <a href="x">ultrasuperwörtern</a>."


                Es soll also wirklich nur außerhalb von "<a" und "a>" ersetzt werden.
                arrays sind klasse

                Kommentar


                • #9
                  hmm,

                  vielmehr hätte mich interessiert, was in den variablen steht, wo die herkommen, wieso ne schleife, aber ....

                  also,

                  dieser regexp (wie immer ohne delimiter, eventuelle zusätzliche escapes sind anzupassen)
                  Code:
                  (?<!<a href=\"[^\"]*\">)(TEST)
                  mit diesem replacement
                  Code:
                  <a href=\"y\">\\1</a>
                  mached auf diesem text
                  Code:
                  <a href="x">TEST</a>TEST<a href="x">TEST</a>
                  und ergibt diesen
                  Code:
                  <a href="x">TEST</a><a href="y">TEST</a><a href="x">TEST</a>
                  so?

                  ps. des sternchen mußte ich ungetestet dahinsetzen, mein regex coach hat 'var length look-behind not implemented (yet)'
                  sollte aber gehen.

                  gewöhnlicherweise stehn im meinem regexp zuviel zeichen, vielleicht läßt sich das was kürzen .... anpassen mußte sowieso auf zusätzlich attr etc.

                  EDIT:
                  copy&paste am besten nur beim zitieren verwenden, das forum schreibts noch etwas um, wenn ich mich nicht verkucke.
                  Zuletzt geändert von derHund; 22.12.2003, 13:42.
                  Die Zeit hat ihre Kinder längst gefressen

                  Kommentar


                  • #10
                    Irgendwie ist da überall der Wurm drin...

                    Aber um meine regex-Kenntnisse zu vertiefen:

                    Warum klappt dashier nicht (es wird ein Fehler angezeigt):
                    PHP-Code:
                    /(?<!\\<a.*)$gwrow[name]/
                    arrays sind klasse

                    Kommentar


                    • #11
                      Warum klappt dashier nicht (es wird ein Fehler angezeigt):
                      PHP-Code:
                      /(?<!\\<a.*)$gwrow[name]/
                      ein fehler also, ... sehr aufschlußreich . know what I mean?

                      sagt doch mal, was du dir vorstellst, was dein regexp da machen soll, und falls das $gwrow[] ein array sein sollte, würde ich es ajf mittels . abgrenzen/aus dem string rausnehmen (paranoia) ....

                      EDIT:
                      und falls das [name] der index sein soll, brauchste ja "" oder zumindest $, also erklär mal deinen regexp schritt für schritt, nach dem motto: ich will alle zeichen, die ..., aber nicht, wenn ..., das aber nur wenn ...
                      Zuletzt geändert von derHund; 22.12.2003, 14:01.
                      Die Zeit hat ihre Kinder längst gefressen

                      Kommentar


                      • #12
                        So sieht der Coda aus:
                        PHP-Code:
                            $get_word mysql_query("SELECT name, link FROM iron_lex_wor WHERE name!='$page_title' AND free='ok' GROUP BY name ORDER BY name ");
                            while(
                        $gwrow mysql_fetch_array($get_word)) {
                            
                        $lex_text preg_replace("/$gwrow[name](?!.*\<)/i","<a href=\"$gwrow[link].htm\">\\0</a>",$lex_text,1);
                            } 
                        So wie er jetzt ist, tut ers, aber eben flasch, weil hierbei wörter nicht mehr ersetzt werden, wenn sie vor einen bestehendem link stehen.

                        Setzte ich das pattern auf
                        PHP-Code:
                        ("/(?<!\>.*)$gwrow[name](?!.*\<)/i 
                        Wirft er diesen Fehler aus:
                        Warning: Compilation failed: lookbehind assertion is not fixed length at offset 8


                        Regex macht mich fertig
                        arrays sind klasse

                        Kommentar


                        • #13
                          warum,

                          füllst du nicht erst das feld und läßt es dann in einem rutsch ersetzen? hab ich was übersehen?

                          - du holst alle wörter in ein array
                          - du machst ein preg_replace mit dem arrays
                          - ende

                          regexp
                          Die Zeit hat ihre Kinder längst gefressen

                          Kommentar


                          • #14
                            Gut, habe das jezt durch die Array ersetzt, aber er tut so immernoch das selbe.

                            PHP-Code:
                            "'$gwrow[name](?!.*\<)'i"
                            hier hat sich ja nichts geändert
                            arrays sind klasse

                            Kommentar


                            • #15
                              hmm,

                              du scheinst mich falsch zu verstehen, theoretisch brauchst du kein look-behind/forward ...

                              - fülle ein feld mit den regexps ...
                              Code:
                              array_push ($regs, "/".$row["name"]."/i")
                              - fülle ein feld mit den replacements
                              Code:
                              array_push ($reps, "<a href=\"".$row["link"]."\">\\1</a>")
                              - einmal preg_replace ...
                              PHP-Code:
                              preg_replace ($regs$reps$im_text_halt); 
                              geht das?
                              Die Zeit hat ihre Kinder längst gefressen

                              Kommentar

                              Lädt...
                              X