preg_replace Funktion gesucht zum ersetzen einzelner Wörter in HTML |
Willkommen, Gast ( Anmelden | Registrierung ) [ Hilfe | Mitglieder | Suche ]
preg_replace Funktion gesucht zum ersetzen einzelner Wörter in HTML |
Mon. 27. October 2008, 22:16
Beitrag
#1
|
|
Administrator Gruppe: Members Beiträge: 1.092 Mitglied seit: 16.06.2006 Wohnort: Köln Mitglieds-Nr.: 1 |
Ich breche mir gerade einen ab bei der Programmierung eines reguären Ausdrucks. Vielleicht weiß ja einer von euch Rat.
Ich habe folgenden Text: ZITAT Lorem ipsum <a href="http://www.xy.de">sit dolor</a> amet, consectetuer adipiscing elit. Vivamus eget nisi. Donec suscipit. Aenean hendrerit augue! Nam justo urna, dictum eu, porttitor eu; accumsan id, eros. Maecenas in justo pharetra <a href="sit">dolor</a> sapien facilisis <span class="dolor">vestibulum</span>. Curabitur facilisis sem ac mauris. Cras massa. Praesent in mauris. Aliquam porta sapien nec velit vehicula accumsan. Fusce a lectus? In diesem Text möchte ich nun alle Vorkommen des Wortes "dolor" durch "<a href="http://www.google.de">dolor</a>" ersetzen. Bedingungen: * Innerhalb von Tags wird das Wort nicht ersetzt * Ist das Wort schon verlinkt (auch als Teilwort) findet dort auch keine Ersetzung statt Ich hab mit einigen regulären Ausdrücken umgespielt und frage mich nun, ob das Problem mit einem regulären Ausdruck überhaupt lösbar ist. -------------------- Es wird, es wird...
|
|
|
Mon. 27. October 2008, 23:21
Beitrag
#2
|
|
Advanced Member Gruppe: Members Beiträge: 54 Mitglied seit: 26.06.2006 Wohnort: Karlsruhe Mitglieds-Nr.: 3 |
Mit einem normalen reguläre Ausdruck geht das leider nicht (da ja -- wenn man mal Erweiterungen wie Assertions absieht, die hier ja leider auch nicht helfen -- reguläre Ausdrücke nur kontextfreie Grammatiken abbilden können)
Aber das hier macht, was du willst und ist beinahe pures RegEx QUELLTEXT <?php $text = <<<ENDE Lorem ipsum <a href="http://www.xy.de">sit dolor</a> amet, consectetuer adipiscing elit. Vivamus eget nisi. Donec suscipit. Aenean hendrerit augue! Nam justo urna, dictum eu, porttitor eu; accumsan id, eros. dolor Maecenas in justo pharetra <a href="sit">dolor</a> sapien facilisis <span class="dolor">vestibulum</span>. Curabitur facilisis sem ac mauris. Cras massa. Praesent in mauris. Aliquam porta sapien nec velit vehicula accumsan. Fusce a lectus? ENDE; $word = "dolor"; $word_e = preg_quote($word,'~'); $processed = preg_replace_callback("~(<a[^>]*href.*{$word_e}.*</a>)|(<[^>]+{$word_e}[^>]*>)|($word_e)~Uims", 'linkify', $text); echo $processed; function linkify($match){ //print_r($match); if (isset($match[3])) { return "<a href=\"http://www.google.de/\">".htmlentities($match[3])."</a>"; } else { return $match[0]; } } Die Idee dahinter: alles, was Du nicht ersetzt haben möchtest, musst Du explizit "wegmatchen". -------------------- Technikwürze - Design & Webstandards Podcast |
|
|
Tue. 28. October 2008, 09:32
Beitrag
#3
|
|
Advanced Member Gruppe: Admins Beiträge: 507 Mitglied seit: 27.06.2006 Mitglieds-Nr.: 11 |
Cool.
|
|
|
Tue. 28. October 2008, 10:27
Beitrag
#4
|
|
Advanced Member Gruppe: Moderators Beiträge: 911 Mitglied seit: 26.06.2006 Wohnort: Essen; Ruhrgebiet Mitglieds-Nr.: 4 |
-------------------- |
|
|
Tue. 28. October 2008, 15:09
Beitrag
#5
|
|
Administrator Gruppe: Members Beiträge: 1.092 Mitglied seit: 16.06.2006 Wohnort: Köln Mitglieds-Nr.: 1 |
Das kommt sofort in meine PHP Trickkiste. Ein super Ansatz. Ich hab mir schon Gedanken darüber gemacht, den Zieltext in eigene Tokens zu zerlegen, damit ich das vernünftig ersetzt bekomme. DANKE!
-------------------- Es wird, es wird...
|
|
|
Guest_bkm_* |
Fri. 28. November 2008, 12:53
Beitrag
#6
|
Guests |
Das kommt sofort in meine PHP Trickkiste. Ein super Ansatz. Ich hab mir schon Gedanken darüber gemacht, den Zieltext in eigene Tokens zu zerlegen, damit ich das vernünftig ersetzt bekomme. DANKE! @bjoern hast du das mittlerweile schon mal im einsatz erprobt ? kann es sein um beim beispiel von oben zu bleiben, das auch (kann sein das wort gibt es nicht ) dolore somit gefunden und ersetzt wird ??? |
|
|
Fri. 28. November 2008, 15:26
Beitrag
#7
|
|
Advanced Member Gruppe: Members Beiträge: 54 Mitglied seit: 26.06.2006 Wohnort: Karlsruhe Mitglieds-Nr.: 3 |
@bjoern hast du das mittlerweile schon mal im einsatz erprobt ? kann es sein um beim beispiel von oben zu bleiben, das auch (kann sein das wort gibt es nicht ) dolore somit gefunden und ersetzt wird ??? Ja, das ist auch so gewollt im Beispiel. Wenn du den Suchbegriff nur als ganzes Wort finden moechtest, musst du per "assertion" sicherstellen, dass es sich bei der Fundstelle um ein alleinstehendes Wort handelt. QUELLTEXT $processed = preg_replace_callback("~(<a[^>]*href.*{$word_e}.*</a>)|(<[^>]+\b{$word_e}\b[^>]*>)|\b($word_e)\b~Uims", 'linkify', $text); Mehr zum Thema Assertions findet sich in der PHP-Hilfe: http://de.php.net/manual/de/reference.pcre...tern.syntax.php PS: In dem Beispiel sollte es auch ohne Assertion gehen -- einfach \b durch \W oder \s ersetzen. Dann kann es allerdings in Sonderfaellen vorkommen, dass du nicht alle Stellen ersetzt. Ein Beispiel: Nimm den Text QUELLTEXT a b a b a b und das Suchwort "a b" heraus kommt QUELLTEXT <a href="...">a b</a> a b <a href="...">a b</a> -> das mittlere "a b" wird nicht ersetzt, da das Leerzeichen bei der ersten Ersetzung schon "angefasst" wurde und jedes Zeichen im Text immer nur ein mal von preg_replace angesehen wird. (darauf baut ja der Trick mit dem "wegmatchen" auf) -------------------- Technikwürze - Design & Webstandards Podcast |
|
|
Guest_bkm_* |
Fri. 28. November 2008, 15:44
Beitrag
#8
|
Guests |
@daniel
danke das mit \b{$word_e}\b funktioniert schon in meinem fall und somit ersetzt dolor auch nicht dolore mehr |
|
|
Vereinfachte Darstellung | Aktuelles Datum: 23.9.24 - 08:10 |