in htmlcode woerter highlighten


  • Mod

    Hallo Leute.

    Ich habe einen Text, zB

    foo: <img src="foo.jpg"> <u>f</u>oo ist foobar
    

    und nun will ich foo durch <b>foo</b> ersetzen.

    dh, aus dem beispieltext soll

    <b>foo</b>: <img src="foo.jpg"> <b><u>f</u>oo</b> ist foobar
    

    man erkennt 3 probleme:

    1. foobar wird nicht markiert

    2. foo.jpg auch nicht

    3. <u>f</u>oo wird gehighlightet

    4. ist recht einfach machbar in dem man testet ob vor und nach foo entweder ende/anfang des strings oder ein 'non word character' ist.

    2+3 schaffe ich momentan nicht.
    fuer 3) wuerde mir einfallen, nach jedem buchstaben in foo (<[^>+>)* erwarten. das waere aber wohl ein bisschen lahm.

    fuer 2. habe ich leider keine idee.

    das wichtige ist: der bestehende HTML Code muss erhalten bleiben, das highlighting ist nur eine nachverarbeitung...

    jemand eine idee?

    der momentane ansatz ist sehr haesslich und kann es wohl nicht sein 😞

    <?php
    $match=array();
    
    $str='foo:  <u>f</u>oo ist foobar';
    $regex='/([^a-z0-9]|^)((<[^>]+>)*f(<[^>]+>)*o(<[^>]+>)*o(<[^>]+>)*)([^a-z0-9]|$)/Ui';
    
    echo preg_replace($regex,'\1<b>\2</b>\7',$str);
    ?>
    

  • Mod

    meine miesen versuche liesen mich zu:

    <?php
    $str='foo: <a href="foo.html">foo</a> <u>f</u>oo ist foobar';
    $regex='/(?!<[^>]*)([^a-z0-9]|^)((<[^>]+>)*f(<[^>]+>)*o(<[^>]+>)*o(<[^>]+>)*)([^a-z0-9]|$)/Ui';
    
    echo preg_replace($regex,'\1<b>\2</b>\7',$str);
    ?>
    

    kommen.

    bitte sagt mir, dass es da etwas besseres gibt...


  • Mod

    mist, das funktioniert leider nicht 😞

    hat jemand ne idee die funktioniert?
    wie kann ich sagen:
    alles nur nicht (<[^>]+) matchen?
    ein lookbehind geht ja nicht, weil es ne variable laenge hat 😞

    😞 😞 😞


  • Mod

    mit (?!<[^>]*) am ende klappt es 🙂

    frage: gibt es eine bessere loesung? die jetztige funktioniert zwar, aber etwas schoeneres waere super 🙂



  • Ich nehme an, du willst alle foo nicht highleiten, die in "" eingeschlossen sind, oder? Zudem kommt aber das Problem dazu, dass du \" nicht meinst 😉


  • Mod

    Loggy schrieb:

    Ich nehme an, du willst alle foo nicht highleiten, die in "" eingeschlossen sind, oder?

    "foo"
    soll zu "<b>foo</b>" werden

    Zudem kommt aber das Problem dazu, dass du \" nicht meinst 😉

    \"foo\"
    soll zu
    \"<b>foo</b>\"
    werden.

    es ist HTML Code in dem ich rumpfuschen will 🙂

    Es ist wie bei Googles "view as html" -> die gesuchten wörter werden gehighlightet. Dabei wird fertiger HTML COde genommen und der filter angewandt. Und schon wird alles schön bunt.

    \" ist in HTML aber 2 zeichen, insofern muss ich mich darum nicht kümmern.

    allerdings hast du mich auf ein Problem gebracht: JavaScript

    <script>
    foo=1;
    </script>
    hier darf foo natürlich nicht ersetzt werden...
    *grml* wird das ganze wieder langsamer...

    thx 👍



  • Also ich kann den PHP-Code dazu nicht, aber vielleicht kann jemand anderes für mich dieses Konzept umsetzen:

    1. Alles, was in und zwischen HTML-Tags steht umwandeln in md5-strings, also z.B. <b>bla bla blubb</b> wird zu <?php md5("<b>bla bla blubb</b>"); ?>

    2. highlighten mit str_replace("suchwort","<b>suchwort</b>",$text);

    3. MD5-Strings wieder zurückwandeln (also vorher alles schön in ein array aufnehmen).

    Achtung! Das geht natürlich nicht bei kompletten Websites, da hier schon der ganze <html></html>-Bereicht gewandelt wird.. und das suchwort darf nicht im MD5-String mit bei sein, sonst haste ne arschkarte gezogen 😉

    Naja, gibt sicher besseres... aber ist halt mal sone idee.



  • Ich denke, mit PREGS lässt sich diese Aufgabe nicht lösen. Du brauchst eher einen kontextsensitiven (also state-machine-basierten) zeichenweisen Interpreter...


  • Mod

    Windoof schrieb:

    Naja, gibt sicher besseres... aber ist halt mal sone idee.

    In etwa so sieht es bei mir aus...

    1. HTML Code bei <body splitten (im header wird nicht gehighlightet)
    2. HTML Kommentare, <script> und <style> rausnehmen und durch eine ID ersetzen. ID beginnt mit < und endet mit > (damit kann die regex nie eine ID ersetzen)
    3. meine moerder regex drueber laufen lassen die weiter oben ja schon beschrieben ist.
    4. wieder einfuegen der 'gestrippten' texte.

    funktioniert und ist annehmbar schnell. preg ist zum glueck so verdammt gut, mit ereg waere das nicht moeglich...


Anmelden zum Antworten