in htmlcode woerter highlighten
-
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:
-
foobar wird nicht markiert
-
foo.jpg auch nicht
-
<u>f</u>oo wird gehighlightet
-
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); ?>
-
-
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...
-
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
-
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
-
Loggy schrieb:
Ich nehme an, du willst alle foo nicht highleiten, die in "" eingeschlossen sind, oder?
"foo"
soll zu "<b>foo</b>" werdenZudem 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...
-
Windoof schrieb:
Naja, gibt sicher besseres... aber ist halt mal sone idee.
In etwa so sieht es bei mir aus...
- HTML Code bei <body splitten (im header wird nicht gehighlightet)
- 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)
- meine moerder regex drueber laufen lassen die weiter oben ja schon beschrieben ist.
- wieder einfuegen der 'gestrippten' texte.
funktioniert und ist annehmbar schnell. preg ist zum glueck so verdammt gut, mit ereg waere das nicht moeglich...