php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
preg_replace doppeltes ersetzen verhindern


 
Olli4
19-11-2008, 10:29 
 
Hi

Gibt es die möglichkeit?
Wenn ich dies habe:
$suche = array('/test1 test2/i', '/test3/i');
$ersetzen = array(......)

Dann mit preg_replace und das klappt wunderbar.

Kann man eine doppelte ersetzung verhindern? Wenn ich dies habe:
$suche = array('/test1 test2/i', '/test/i');
$ersetzen = array(......)
Wird erst das erste ersetzt und danach aber nochmals test. Kann ich dies irgendwie verhindern? Hätte gerne das wenn test1 test2 vorkommt er es nicht nochmals nachher bei test ersetzt?

Danke für eure tipps.

Gruss

Olli

 
Morpheus2100
19-11-2008, 10:43 
 
Hallo Olli,

schau dir mal den LINK (http://de.php.net/preg_replace) an müsste mich Limit gehen!

"Limit
Die maximal mögliche Anzahl von Ersetzungen für jedes Suchmuster in jeder Zeichenkette . Standardmäßiger Wert: -1 (kein Limit). "

Schöne Grüße
Morph

 
Olli4
19-11-2008, 10:51 
 
Hi

Danke dir. Habe es mir mal durchgelesen. So viel ich es verstanden habe, kann ich ihm sagen das er es nur X mal ersetzt.

Ich möchte aber, dass er die suchwörter jedesmal ersetzt wenn sie vorkommen. Das kann 2 mal sein das kann 10 mal sein.

Ich habe ja folgende zwei suchmuster:
test1 test2
test3
Nehmen wir nun ein anderes beispiel:
brauner bär (wird der text formatiert)
bär (wird der text formatiert)
Nun soll er mir im text "ein brauner bär der zu... bär gehört..." beides formatieren. Wenn ich es so habe, formatiert er einmal "brauner bär" und zweimal "bär". Er soll mir aber "brauner bär" nicht nochmals formatieren, da ja "brauner bär" bereits ersetzt wurde mit einer formatierung.

Hoffe ich konnte es einigermasen verständlich erklären.

Gruss

Olli

 
fireweasel
19-11-2008, 12:59 
 
Hoffe ich konnte es einigermasen verständlich erklären.
Ehrlich gesagt, nein, ich verstehe nur Bahnhof. Habe allenfalls eine dumpfe Ahnung, was du vorhast.

Preg_replace() nimmt selbst keine Mehrfach-Ersetzungen vor, die treten nur auf, wenn du als Suchmuster ode|und Ersetzen-String ein Array angibst. Oft lässt sich die Angabe des Arrays vermeiden, wenn man den Suchstring anders konstruiert. Auch preg_replace_callback() (http://de3.php.net/manual/de/function.preg-replace-callback.php) könnte eine Hilfe sein. Aber ohne eine genauere Problembeschreibung kann man leider nur im Nebel stochern.

Kannst du dein Problem nicht konkret beschreiben, ohne abstrakte Beispiele zu konstruieren, die dann irgendwie unlogisch oder unverständlich sind? So wie das hier:

Ich habe ja folgende zwei suchmuster:
test1 test2
test3 ...
Zwei oder Drei?

brauner bär (wird der text formatiert)
bär (wird der text formatiert)
Nun soll er mir im text "ein brauner bär der zu... bär gehört..." beides formatieren. Wenn ich es so habe, formatiert er einmal "brauner bär" und zweimal "bär". Er soll mir aber "brauner bär" nicht nochmals formatieren, da ja "brauner bär" bereits ersetzt wurde mit einer formatierung.

Hüh, Formatierung?

Stell dir folgende Fragen:
Wie lautet dein zu durchsuchender String? (der "Heuhaufen")
Wie lautet das darin zu ersetzende Text-Muster? (die "Stecknadel")
Wie lautet das darin nicht zu ersetzende Text-Muster?
Wie lautet der Ersetzen-String?
... und teile uns deine Antworten mit, falls du selbst keine Lösung findest.

Beim Testen von Regulären Ausdrücken für preg_replace() eignet sich übrigens preg_match_all() (http://de3.php.net/manual/de/function.preg-match-all.php) gut. Das gibt dir bei gleichem PCRE alle Fundstellen zurück, an denen preg_replace() eine Ersetzung vornehmen würde. Mit var_dump() (http://de3.php.net/manual/de/function.var-dump.php) kannst du dir die Liste anschauen.

 
Olli4
19-11-2008, 13:21 
 
HI

Ich versuchsmal mit dem beispiel von oben. Die sätze ändern sich die ganze zeit also kann ich keine konkreten beispiele nennen da ich noch keines weiss.
$satz = "der braune bär traf im wald auf einen anderen bären";
$suche = array("/braune bär/i", "/bär/i", "/wald/i");
$ersetze = array("<a href="...">braune bär</a>", "<a href="...">bär</a>", "<a href="...">wald</a>");

Die formatierungen gehen zwar noch weiter aber denke für ein klares beispiel dürfte dies reichen.

Nun habe ich mit diesem preg_replace mehrere Probleme:
Der satz würde ja ungefähr nachher so aussehen: "der <a href="...">braune <a href="...">bär</a></a> traf im <a href="...">wald</a> auf einen anderen <a href="...">bär</a>en"
Hier habe ich nun eben die Probleme:
1. Er formatiert mir braune bär zweimal da einmal braune bär eine suche ist und einmal bär was ich gerne verhindern würde.

2. Das weiss ich nicht mal ob es irgendwie gehen könnte. Er formatiert mir bären obwohl das suchwort bär ist. Kann man das machen das er nur das wort bär formatieren würde wenn es ein einzelnes wort ist? Hab zuerst gedacht als suche mach ich einfach "/ bär /i". Nur hier ist das problem wenn es danach oder davor irgendwelche satzzeichen gibt oder es an einem satzanfang ist ohne leerschlag nimmt er es dann auch nicht

Ich hoffe, ich konnte es besser beschreiben. Hab leider etwas mühe damit.

Gruss

Olli

 
fireweasel
19-11-2008, 13:49 
 
Ich versuchsmal mit dem beispiel von oben. Die sätze ändern sich die ganze zeit also kann ich keine konkreten beispiele nennen da ich noch keines weiss.
Wo kommen die Suchmuster her? Benutzereingaben? Aus irgendeiner vorgefertigten Liste (Datenbank)?


$satz = "der braune bär traf im wald auf einen anderen bären";
$suche = array("/braune bär/i", "/bär/i", "/wald/i");
$ersetze = array("<a href="...">braune bär</a>", "<a href="...">bär</a>", "<a href="...">wald</a>");

Die formatierungen gehen zwar noch weiter aber denke für ein klares beispiel dürfte dies reichen.

Nun habe ich mit diesem preg_replace mehrere Probleme:
Der satz würde ja ungefähr nachher so aussehen: "der <a href="...">braune <a href="...">bär</a></a> traf im <a href="...">wald</a> auf einen anderen <a href="...">bär</a>en"
Hier habe ich nun eben die Probleme:
1. Er formatiert mir braune bär zweimal da einmal braune bär eine suche ist und einmal bär was ich gerne verhindern würde.

'/(braune\s+)?bär/' findet 'bär' und 'braune bär' und spart dir einen Eintrag im "Stecknadel"-Array.


2. Das weiss ich nicht mal ob es irgendwie gehen könnte. Er formatiert mir bären obwohl das suchwort bär ist. Kann man das machen das er nur das wort bär formatieren würde wenn es ein einzelnes wort ist? Hab zuerst gedacht als suche mach ich einfach "/ bär /i". Nur hier ist das problem wenn es danach oder davor irgendwelche satzzeichen gibt oder es an einem satzanfang ist ohne leerschlag nimmt er es dann auch nicht
Es gibt Suchmuster-Klassen für "Buchstaben" und Assertions für Wortgrenzen. Die kranken aber beide daran, dass entweder nicht alle Buchstaben erfasst werden (8-Bit-Modus) oder die Suchmuster-Tabellen sehr groß werden können (UTF-8-Modus).

Es gibt eine Seite zur PCRE-Syntax im PHP-Handbuch (http://de.php.net/manual/de/reference.pcre.pattern.syntax.php). Die ist aber komplett in Englisch, und hat keine verlinkbaren Unterabschnitte. Du musst also auf der Seite nach den englischen Begriffen suchen, wenn du nicht den kompletten Text lesen möchtest (was aber gar nicht so verkehrt wäre).

Die Suchmusterklassen ("character classes"):
\w passt auf "Buchstaben" ("any perl word character")
\W Umkehrung von \w

Die Assertions (dürfen nicht in einer Zeichen-Klasse vorkommen):
\b "Wort"-Grenze ("word boundary")
\B Umkehrung von \b

Streng genommen, sind \b und \B nur wieder Abkürzungen, man kann Wort-Grenzen auch mit '\W\w' (Wortanfang) und '\w\W' (Wortende) prima selber basteln. ;-)

Auf dein bäriges Beispiel angewendet:
'/\Wbär\W/' findet nur noch 'bär', aber nicht 'bären' und auch nicht 'eisbär'.


Ich hoffe, ich konnte es besser beschreiben. Hab leider etwas mühe damit.

Üben, üben, üben! ;-)
Eine gute Problembeschreibung ist oft schon die halbe Lösung.

 
Olli4
19-11-2008, 14:06 
 
Hi

Danke. Werde das mal probieren und mich durch die seite kämpfen. Bin in englisch leider nicht gut aber das wird schon :)

Gruss

Olli


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:16 Uhr.