Ankündigung

Einklappen
Keine Ankündigung bisher.

Suchen und ersetzen außerhalb von HTML, dabei wird js escape

Einklappen

Neue Werbung 2019

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

  • Suchen und ersetzen außerhalb von HTML, dabei wird js escape

    Hallo!

    Mit folgendem Code suche und ersetze ich in einer Datei nach einem Suchwort und gebe sie dann aus, aber nur außerhalb vom HTML Code.

    PHP-Code:
    // Wenn der Parameter "rslt" existiert
     
    if(isset($_GET['rslt'])) {
      
    //Ausgabepuffer wird aktiviert
      
    ob_start();
      
    // Suchwort wird im Falle in HTML umgewandelt
      
    $kw htmlentities($_GET['kw'],ENT_QUOTES);
      
    $datei $_GET['rslt'];

      
    // Inhalt der Datei wird in den Ausgabepuffer gepackt
      
    include($datei);

      
    // Inhalt des Puffers in Variable speichern
      
    $DateiEcho ob_get_contents();

      
    // Nur außerhalb von Tags wird das Suchwort gesucht und ersetzt und in Variable gespeichert
      
    $ChgDatei preg_replace("/((<[^>]*)|$kw)/ie"'"\2"=="\1"? "\1":"<span class=\"error\">\1</span>"'$DateiEcho);

      
    // Ausgabepuffer wird deaktiviert und gereinigt
      
    ob_end_clean();

      
    // Der bearbeitete und gespeicherte Inhalt wird ausgegeben
      
    echo $ChgDatei;
     } 
    Dies funktioniert auch wunderbar, das Problem ist, das im Javascript "escaped" wird. Was ursprünglich:

    Code:
    var lsIdStr = 'Betreff';

    war, ist nun

    Code:
    var lsIdStr = \'Betreff\';

    Dies führt zu Fehlermeldungen, da die Hochkommas nun aufgehoben werden.

    In der Zeile könnte man dies denke ich ändern oder? Aber wie?
    PHP-Code:
    $ChgDatei preg_replace("/((<[^>]*)|$kw)/ie"'"\2"=="\1"? "\1":"<span class=\"error\">\1</span>"'$DateiEcho); 

  • #2
    So habe ich das erste Problem gelöst, ich musste einfach noch ein Hochkomma einfügen:

    <?php $ChgDatei = preg_replace("/((<[^>']*)|$kw)/ie", '"\2"=="\1"? "\1":"<span class=\"error\">\1</span>"', $DateiEcho);

    Somit kommt es nicht mehr zu dem Problem, wenn jetzt aber eine Zeile, wie diese vorkommt:

    Code:
    onmouseover="return overlib('<a href=\'?cnt=seite.php&nav_sub=21#anker\' class=\'cnt\'>- Forming <span class="error">Anker</span></a>', STICKY, CAPTION, 'Headline',...
    Wird auch inerhalb ersetzt, hier z.B. wird das Wort anker nach der Raute ersetzt, was die Ausgabe etwas komisch aussehen lässt.

    Code:
    onmouseover="return overlib('<a href=\'?cnt=seite.php&nav_sub=21#<span class="error">anker</span>\' class=\'cnt\'>- Forming <span class="error">Anker</span></a>', STICKY, CAPTION, 'Headline',...

    Kommentar


    • #3
      Kann mir jemand bitte diese Zeile erläutern:

      PHP-Code:
      $ChgDatei preg_replace("/((<[^>]*)|$kw)/ie"'"\2"=="\1"? "\1":"<span class=\"error\">\1</span>"'$DateiEcho); 
      Ich verstehe es so, dieser Part
      PHP-Code:
      ((<[^>]*)|$kw)/ie", 
      bedeutet, das ab dem "<" gesucht werden kann, aber nicht was innerhalb von ">" steht, *)|$kw kann ich nicht wirklich verstehen

      Diesen Part verstehe ich ungefähr so:
      PHP-Code:
      '"\2"=="\1"? "\1":"<span class=\"error\">\1</span>"' 
      Wenn das erste oder 2te Suchmuster gefunden wird, wird es mit "\1" oder ":"<span class=\"error\">\1</span> ersetzt.

      So jetzt könnt ihr schmunzeln und mich dann bitte aufklären :wink:

      Kommentar


      • #4
        ich versteh es auch noch nicht so richtig, weshalb der erste oder teil gesucht wird, wenn er nachher sowieso ausgeschlossen wird. ich glaube ich hätte das mit Assertions
        gemacht. Aber der Code funktioniert ganz gut, Kompliment. Nur weiß ich nicht was passiert, wenn man große Datenmengen prüft, denn wie ichs verstehe wird ja jede einzelne zusammenhängende Zeichenkette durchlaufen und ersetezt, wenn auch mit sich selbst.
        @NetLook : ich glaube wenn du das ' wieder rausnimmst und den Inhalt vorher anders von Hochkommata befreist geht das einfacher..

        Kommentar


        • #5
          Hi!

          Wie kann ich das denn hinbekommen, das auch nichts innrehalb einer Klammer ersetzt wird? Habe es so probiert:

          PHP-Code:
          $ChgDatei preg_replace("/((<[^\('>]*)|$kw)/ie"'"\2"=="\1"? "\1":"<span class=\"error\">\1</span>"'$DateiEcho);

          //oder auch mit ASCII Code

          $ChgDatei preg_replace("/((<[^\x40'>]*)|$kw)/ie"'"\2"=="\1"? "\1":"<span class=\"error\">\1</span>"'$DateiEcho); 
          Bringt aber nichts, in einem anderen Forum hat mir jemand die Zeile aufeschlüsselt:

          PHP-Code:
          $ChgDatei preg_replace(
          //sollte soweit klar sein.. 

          "
          //beginnt den suchstring

          /
          //sogenannter delimiter.. beginnt den regulären ausdruck


          ((<[^>]*)|
          $kw)
          //finde alle zeichenfolgen, die als erstes zeichen < haben
          gefolgt von beliebig vielen zeichen, die nicht > sind oder aber die genau 
          $kw entsprechen

          /
          //schließender delimiter beendet den regulären ausdruck
          i
          //unterscheide nicht zwischen groß- und kleinschreibung
          e
          //sorge dafür, dass backreferences im ersatzstring evaluiert werden. Damit ist ein ersetzen von PHP-Code vor der ausführung des codes möglich. die rückgabe ist dann das ergebnis der execution

          "
          //ende des suchstring

          '

          "\2"=="\1"? "\1":"<span class=\"error\">\1</span>"
          // hier wird es spannend... denn hier kommt das e ins spiel.. wenn zweiter match == erster match, schreibe erster match, sonst schreibe <span class blablubber error>erster match</span>

          '
          $DateiEcho
          //mach das ganze mit dem Inhalt von $DateiEcho


          ); 
          Ich kapiere aber nicht, wie dann nur außerhalb von Tags gesucht und ersetzt werden kann!
          PHP-Code:
          ((<[^>]*)|$kw)
          //finde alle zeichenfolgen, die als erstes zeichen < haben
          //gefolgt von beliebig vielen zeichen, die nicht > sind oder aber die genau $kw entsprechen 
          Denn so gesehen, würde ja nur > nicht gefunden werden oder?!

          Kommentar


          • #6
            ja aber es wird quasi <xyz parameter ="bla" mit sich selbst verglichen (\1==\2) und bei Übereinstimmung mit sich selbst zurückersetzt "\1". reguläre Ausdrücke sind so gierig, daß sie alles bis zum schließenden > an sich reißen.
            das meinte ich mit sich selbst ersetzen. das Keyword selbst wird dagegen nicht geklammert und deshalb gibts \2 nicht und der Vergleich ergibt stets null.
            vielleicht würde es etwa so funktionieren (ungeprüft):
            Code:
            ((<[^>]*)|(\([^\)]*)|$kw)

            Kommentar


            • #7
              Ne funktioniert leider nicht, ich bin echt am verzweifeln!!!

              Kommentar


              • #8
                korrektur:
                Code:
                /((<[^>]*|\([^\)]*)|$kw)/ies
                funktioniert bei mir, bin aber nicht sicher ob ich genau verstanden habe was genau du möchtest.

                Kommentar


                • #9
                  Auch nicht, leider, aber Danke!

                  Oben die ersten beiden Beiträge von mir, da steht mein Problem beschrieben. Da ich das Problem des ersten Beitrags lösen konnte, indem ich ein ' in die Gruppe einfüge ergaben sich aber andere Probleme.
                  Wenn beim Ersetzen nicht escaped werden würde, ohne das sich dann neue Probleme ergeben,das wäre mein Ziel!

                  Es darf also nicht vor einem ' ein \ beim ersetzen gesetzt werden!

                  Kommentar


                  • #10
                    jetzt hab ich dein problem geschnallt. außer warum du die (...) sachen nicht finden möchtest. schlechte nachrichten:
                    e
                    Wenn dieser Modifikator gesetzt ist, macht preg_replace() in der Ersetzungszeichenkette eine normale Ersetzung von Rückrefenzen, wertet sie als PHP-Code aus und verwendet das Ergebnis um damit die gesuchte Zeichenkette zu ersetzen. Einfache und doppelte Anführungszeichen werden in den ersetzten Rückreferenzen mit einem Backslash maskiert.
                    mußt du also nachträglich die \' zu ' umwandeln schätze ich.

                    Kommentar


                    • #11
                      Hallo!

                      Ich habe das jetzt so geschrieben:

                      PHP-Code:
                      // Inhalt des Puffers in Variable speichern
                              
                      $DateiEcho ob_get_contents();
                              
                              
                      // Nur außerhalb von Tags wird das Suchwort gesucht und ersetzt und in Variable gespeichert
                              
                      $ChgDatei preg_replace("/((<[^>]*)|$kw)/ie"'"\2"=="\1"? "\1":"<span class=\"error\">\1</span>"'$DateiEcho);
                              
                      $ChgDatei preg_replace("/\\'/""'"$ChgDatei); 
                      Aber alle ' werden zu \' gemacht und dabei bleibt es auch, aber ich wüsste nicht wie ich das sonst schreiben müsste als /\\'/

                      Kommentar


                      • #12
                        Ah, so ging es, aber...

                        PHP-Code:
                        $ChgDatei preg_replace("/\\\'/""'"$ChgDatei); 
                        Ich brauche das <span class=\'error\'>\1</span> von

                        PHP-Code:
                        $ChgDatei preg_replace("/((<[^>]*)|$kw)/ie"'"\2"=="\1"? "\1":"<span class=\'error\'>\1</span>"'$DateiEcho); 
                        im Quelltext mit Backslash, aber jetzt ersetze ich ja alle \' am Ende wieder mit ', wie muss man das denn schreiben, das alle \' außer <span class=\'error\'> ersetzt werden?

                        Kommentar


                        • #13
                          Andere Frage, wie kann man das denn schreiben, das nur die "Hauptklammern" berücksichtig werden?

                          PHP-Code:
                          [img]bild.gif[/img]keyword</a>');> 
                          Hier z.B. hat man die wahren < und > vom Image-Tag, aber auch "unwahre", die als Parameter übergeben werden. Wie kann ich denn nun die Klammern in den Klammern von der Suche ausgrenzen?

                          Denn hiermit
                          PHP-Code:
                          $ChgDatei preg_replace("/((<[^>]*)|$kw)/ie"'"\2"=="\1"? "\1":"<span class=\'error\'>\1</span>"'$DateiEcho); 
                          wird alles außerhalb von <...> ersetzt, was bedeutet, das Keyword wird auch ersetzt, da es außerhalb von <...> ist.

                          Kommentar


                          • #14
                            ich verstehe deine suchfunktion irgendwie nicht. was soll den nun alles gefunden werden. mal mit tags, mal die inhalte in den tags. irgendwie eigenartig.

                            Kommentar


                            • #15
                              Hier ist schon mal ein sehr hilfreiches Tool:

                              http://www.dhtmlgoodies.com/scripts/...xpression.html

                              Wenn ich damit meine Suchfunktionen teste, wächst mein ? über dem Kopf

                              Denn hiermit:
                              PHP-Code:
                              ((<[^>]*)|Suchwort
                              wird alles innerhalb der < markiert bis zum >

                              < code..... >

                              Aber in den spitzen Klammern soll gar nichts angefasst werden und in der erweiterten Version mit ersetzen...

                              PHP-Code:
                              preg_replace("/((<[^>]*)|$kw)/ie"'"\2"=="\1"? "\1":"<span class=\'error\'>\1</span>"'$DateiEcho); 
                              Wenn Suchmuster 2 = Suchmuster 1 ist, dann ersetze mit der 1ten Klammer, ansonsten mit <span class'\error\'... ???
                              Wann ist denn Suchmuster 2 = Suchmuster 1, wenn nur außerhalb von <> gesucht werden soll.

                              Anstatt mehr davon zu verstehen, schein ich mich immer weiter davon zu entfernen

                              Kommentar

                              Lädt...
                              X