• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Regular Expression mit preg_replace

vincentVirgile

New member
OS: Suse
PHP: version 5.2

Scenario:
Ich habe ein text wo das suchwort ersatzt werden muss durch die werte von $replace. Nun es konnte passieren das ein bild, eine e-mail adresse oder irgendwelche andere tag die charcter combination hat worauf ich gerade suche.

Das problem ist klar: wenn ich suche nach "xxx" und in mein text steht eine verweisung nach xxx (<a href="xxx.html">Hallo Welt in xxx) dan würde auf basis von eine klasische str_replace($search,"<span class=\"markSearchString\">$search</span>",$caption); das ganze schlecht aus sehen.

Dieses beispiel würde so aus sehen:
<a href=<span class="markSearchString">xxx</span><span class="markSearchString">xxx</span>.html">

mmm... nicht gerade was ich mich wunsche.
also dachte ich, eine regular expression konnte dies lösen, nun die expression hat eine voraussetzung:

Logische Ausdruck:

A)Suche nach alles was mit < anfangt und mit > endet, dazwischen darf egal was stehen!
B) ersetzte alle werten die gleich sind an xxx aber nicht gleich an A.

Regulare Ausdruck:

A) [^<*>] //Alles was innerhalb <> steht ignorieren
B) [$search] //erlauben

zusammen als regulare ausdruck
([^<*>][$search])
oder
preg_replace("([^<*>][$search])" ,"<span class=\"markSearchString\">$search</span>", "<a href="xxx.html">Hallo Welt in xxx")


Wie gesagt, regex sind nicht meine starke, lerne jedoch gerne dazu...

Die letztendliche Frage
Was stimmt nicht an meine Logik?

wenn ich es so mache ersetzt er die sache aber verdoppelt meine menge an xxx und wenn ich nach meine regexpattern[$search]{3}, dazu setze, macht er genau dasselbe wie str_replace... :icon8:

das endresult sollte jedoch so aussehen:
<a href="xxx.html">Hallo Welt in <span class=\"markSearchString\">xxx</span>
:grin:

Die Quelcode

PHP:
<?php
$search = "xxx" ;
$subject = "Hello world in PHP and xxx is in my text search for xxx and replace it with a span or just <a href=\"xxx.html\">click here</a> for more information" ;
$pattern = "([^<*>][$search])" ;
$replace = "<b>$search</b>" ;

$newText= preg_replace($pattern, $replace, $subject) ;
print($newText);
?>

Danke vielmals,

Vincent
 
Zuletzt bearbeitet:
@Dormilich: Du hast Recht - der Ansatz ist nicht ausgereift. Er funktioniert überhaupt nicht.

PHP:
<?php
$str = '<a href="xxx.html">Hallo Welt in xxx';

echo preg_replace("/(?!<[^>]*)(xxx)(?![^>]*>)/", '<span>$1</span>', $str);

?>
 
Hier ist meiner Meinung eine recht gute Zusammenfassung - ist zwar für JS, aber preg verwendet ja auch PERL-Syntax (wie ja auch schon im Namen preg).
 
Also danke an allen und Kkaspner du bist ja wirklich gut, egal ob es fuer Jscript gedacht ist, in der tat ist die perl syntax die gleiche...
auf jeden fall, vielen dank...
:d
:mooh:
 
Konntest du diese regex mal zerbrechen und erlauteren, das währe sowie online unterricht :)

Funktioniert recht gut, bis auf einem punkt das er nur einmal xxx ersätzt in der text und er sollte das recursiv machen.
Mein beispiel war ja um es besser darzustellen, nun in der tat, handelt es sich um ein ganze text mit mehrere occurences xxx.

Danke nochmals
 
Zuletzt bearbeitet:
In der Eile was falsch kopiert:
PHP:
<?php
$str = '<a href="xxx.html">Hallo Welt in xxx</a> Lorem Ipsum sit amet xxx, ad vivid consectuar xxx et xxx en mi casa o mi cama xxx a la playa consortium Podus Ipsxxx. <a href="mailto:xxx@hotmail.com">Mail</a>';

echo preg_replace("/(?!<[^>]*)(xxx)(?![^<]*>)/", '<span style="color: red;">$1</span>', $str);

?>
also der Teil in der ersten Klammer ist ein negative lookahead ("(?!") d.h. wenn er diesen Ausdruck direkt vor dem xxx findet wird es als nicht gefunden deklariert. In der 3. Klammer das selbe - die zweite ist nur damit wir in der Ersetzung unseren gefundenne String zur Verfügung haben.
Die Ausdrücke in den negative lookaheads besagen eigentlich nur, dass vor/nach dem Gefundenen kein Tag geöfffnet/geschlossen wurden durfte.
 
Joa, vielen dank nochmal für die erlauterung... war ungefär so wie ich es verstanden hatte. Nun du scheinst wirklich erfahrung zu haben mit regex.
Cool, habe wieder viel dazu gelernt innerhalb eine function.
Lass uns nochmal bestätigen das die regular expressions oberst geil sind, ohne die währe das ganze eine riese aufwand... lol.
Ciao :)
 
Zurück
Oben