Willkommen, Gast ( Anmelden | Registrierung )     [ Hilfe | Mitglieder | Suche ]

 
Reply to this topicStart new topic
> preg_replace Funktion gesucht zum ersetzen einzelner Wörter in HTML
bjoern
Beitrag 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...
Go to the top of the page
 
+Quote Post
Daniel
Beitrag 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 smile.gif

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
Go to the top of the page
 
+Quote Post
mvsxyz
Beitrag Tue. 28. October 2008, 09:32
Beitrag #3


Advanced Member
********

Gruppe: Admins
Beiträge: 507
Mitglied seit: 27.06.2006
Mitglieds-Nr.: 11



Cool. cool.gif
Go to the top of the page
 
+Quote Post
saschapi
Beitrag 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



ZITAT(mvsxyz @ Tue. 28. October 2008, 09:32) *
Cool. cool.gif

Zustimmung! cool.gif


--------------------
Go to the top of the page
 
+Quote Post
bjoern
Beitrag 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...
Go to the top of the page
 
+Quote Post
Guest_bkm_*
Beitrag Fri. 28. November 2008, 12:53
Beitrag #6





Guests






ZITAT(bjoern @ Tue. 28. October 2008, 15:09) *
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 wink.gif ) dolore somit gefunden und ersetzt wird ???
Go to the top of the page
 
+Quote Post
Daniel
Beitrag 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



ZITAT(bkm @ Fri. 28. November 2008, 12:53) *
@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 wink.gif ) 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
Go to the top of the page
 
+Quote Post
Guest_bkm_*
Beitrag 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 rolleyes.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 Besucher lesen dieses Thema (Gäste: 1 | Anonyme Besucher: 0)
0 Mitglieder:

 



RSS Vereinfachte Darstellung Aktuelles Datum: 24.4.24 - 10:34

Sefrengo ist ein eingetragenes Markenzeichen und urheberrechtlich geschützt.
Copyright 2009 Design & Daten, Alle Rechte vorbehalten.