Problematischer RegExp

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

  • Problematischer RegExp

    Hallo, ich habe da eine härtere Nuss zu kancken.

    Ich habe eine Suchfunktion, die mir die Seiten eines CMS listet, auf der der Suchbegriff gefunden wurde.

    Wenn ich nun eine der Seiten anklicke, sollen mir alle Vorkommen dieses Wortes auf der Seite rot markiert werden.
    Bis dahin ist es auch kein Problem.

    Allerdings gibt es auch Links zu anderen Seiten oder Download-Dokumente auf dieser Seite.
    Wenn nun mein Suchbegriff "Buch" ist und es einen Link zu "downloads/hoerbuch.jpg" gibt, dann wird daraus natürlich:
    downloads/hoer<font color="CC0000">buch</font>.jpg

    Meine regex ist ganz simpel:
    $content = preg_replace("!".$keyword."!eisUS", "mark_result('\\0')", $content);

    Ich habe auch schon versucht nur text zu durchsuchen, der nicht in Anführungszeichen steht:
    "![^\"]*".$keyword."[^\"]*!eisUS"

    Also: finde alles außer " gefolgt von $keyword geflolgt von alles außer ".
    Aber das funktioniert auch nicht.

    Hat jemand einen besseren Ansatz oder ganz anderen Lösungsvorschlag?
    Fakt ist, dass der Link mit im Content steht, aber nicht erkannt werden soll.

    Dank & Grüße,
    Andi

  • #2
    was ist denn, wenn Du nach Deinem Keyword mit Leerzeichen davor und danach suchst? Dann würdest Du solche Fälle zumindest ausschliessen.

    Allerdings bleibt dann die Frage, ob dass Deiner gewünschten Suche entspricht oder ob Dir dann Treffe verlorn gehen.
    Die zehn Gebote sind deswegen so kurz und logisch, weil sie ohne Mitwirkung von Juristen zustande gekommen sind. (Charles de Gaulle)

    Kommentar


    • #3
      Ja, weil es ja auch Teilbegriffe sein können, bzw. diese auch markiert werden sollen.
      Wie z.B. "buch" bei "Hörbuch" oder "Buchstabensuppe".

      Aber ich könnte es soweit einschränken, dass der Suchbegriff am Wortanfang oder -ende stehen muss. Wäre dann ein Kompromiss.

      Danke,
      Andi

      Kommentar


      • #4
        such doch einfach nach einem text, hinter dem ein < steht, vor dem kein > steht - dann bist du auf jeden fall außerhalb von html-tags ...
        Die Zeit hat ihre Kinder längst gefressen

        Kommentar


        • #5
          Ja, aber was mache ich, wenn es keinen Link nach dem gesuchten Wort gibt? Da bekomme ich dann mit "Text, hinter dem ein < steht" keinen Treffer.

          Es ist so, dass ich ein Template mit HTML-Kopf und Fuß habe. Der Content aus der DB enthällt dann weiterhin keinen Tags, es sei denn es gibt einen Link.

          Kommentar


          • #6
            Ja, aber was mache ich, wenn es keinen Link nach dem gesuchten Wort gibt? Da bekomme ich dann mit "Text, hinter dem ein < steht" keinen Treffer.
            den sonderfall habe ich extra außen vor gelasssen, weil eigentlich immer ein tag am ende einer vollständigen html-seite steht ... hast du nur teile, mußt du das pattern einfach erweitern ... mit 'oder nix davon' ... müßte doch machbar sein?
            Die Zeit hat ihre Kinder längst gefressen

            Kommentar


            • #7
              Ich habe es jetzt ganz simpel gelöst:

              Ich habe es um eine Funktion erweitert. Ich lasse nachdem ich alle gefundenen Texte markiert habe eine weitere Suche darüber laufen, die mir alle "<a href"s filtert...
              PHP-Code:
              $content preg_replace("!<a href=\"(.*)\" !eisUS""link_repair('\\\\1')"$content); 
              und schmeisse aus dem gefundenen String die Font-Tags einfach wieder raus:
              PHP-Code:
              function link_repair($result){

                  
              $result preg_replace("#<.?font.*>#isUS"""$result);
                  
              $result '<a href="'.$result.'" '// Auch hier das Leereichen wieder dazu
                  
              return $result;

              Beachtet, dass in dem RegExp hinter dem schließenden Anführungsstrichen von href noch ein Leerzeichen ist. Sonst gibts Gehacktes, da der Font-Tag im Link ja auch Anführungszeichen enthällt:
              <font color="#CC0000">

              Ist zwar nicht die performanteste Lösung, aber den RegExp so hinzubasteln, dass der vorab schon richtig filtert, wird wohl auch ein bisschen performance kosten.
              Darum lieber zwei simple RegExp als einen mega-komplizierten.
              Zuletzt geändert von andik2000; 21.11.2005, 15:22.

              Kommentar

              Lädt...
              X