• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Es regnet, ist neblig und kalt, alle sind krank und der Chef wird zunehmend cholerisch. Das Thema des Monats ist also folgerichtig --> Das Grau(en)
    Wir sind gespannt, war Euch dazu einfällt! Zum Wettbewerb --> Klick

preg_replace Problem

duderino

Prinzenapfel
Registriert
26.01.06
Beiträge
555
Hallo zusammen, ich habe ein kleines Problem mit den regulären Ausdrücken von PHP. Ich habe ein Array mit verschiedenen Begriffen. Nach diesen Begriffen will ich in einer Variable mit Text suchen und durch Werte die in einem anderen Array stehen ersetzen. Das Problem an der Sache ist, dass ich nur komplette Wörter ersetzen möchte. Wortabschnitte sollen nicht beachtet werden. D.h. wenn das Wort "Angel" in meinem Array steht, soll auch nur das Wort Angel ersetzt werden, nicht z.B. auch Angelrute oder Angelhaken.

Wäre toll wenn mir jemand helfen könnte.

Grüße
 

Salzi

Prinzenapfel
Registriert
29.08.06
Beiträge
555
Hallo

Erstmal als Vorwarnung: Mit regulären Ausdrücken hab ichs auch net so drauf ...
Aber trotzdem mein Versuch.
Im Grunde sehr einfach. Am Anfang eines Wortes welches ersetzt werden muss, muss /\b stehen. Am Ende dann \b/.

Hab hier mal 2 kleine Scripts die das verdeutlichen sollen:

Code:
$string = 'Er wohnt auf einem schönen Baumhaus';
echo $string."<br>";
$patterns[0] = '/\bwohnt\b/';
$patterns[1] = '/\bauf\b/';
$patterns[2] = '/\bhaus\b/';
$replacements[2] = 'lebt';
$replacements[1] = 'in';
$replacements[0] = 'wohnung';
echo preg_replace($patterns, $replacements, $string);

Ausgabe:
Code:
Er wohnt auf einem schönen Baumhaus
Er lebt in einem schönen Baumhaus
wohnt und auf wird also ersetzt. Nicht aber das Baumhaus.

Damit du das nicht vor jeden Suchwort eingeben musst lässt sich das ganze auch in einer Schleife verarbeiten. (Tut mir mal echt Leid mir gefällt die Lösung nur bedingt. Gibt ganz bestimmt elegantere Lösungen also diese hier aber ich komm beim besten Willen nicht drauf :()

Code:
$string = 'Er wohnt auf einem schönen Baumhaus';
echo $string."<br>";
$patterns[0] = 'wohnt';
$patterns[1] = 'auf';
$patterns[2] = 'haus';
$replacements[0] = 'lebt';
$replacements[1] = 'in';
$replacements[2] = 'wohnung';

$counter=count($patterns);
for($i=0; $i<$counter; $i++)
{
    $string= preg_replace("/\b".$patterns[$i]."\b/", $replacements[$i], $string); 
}

echo $string;

Die Ausgabe ist die gleiche.

Ich hoffe ich konnte bischen Licht ins Dunkel bringen.

Gruss

Salzi
 
  • Like
Reaktionen: duderino

duderino

Prinzenapfel
Registriert
26.01.06
Beiträge
555
Hey, super. Soweit ich das sagen kann hat es funktioniert. Danke!!!
 

duderino

Prinzenapfel
Registriert
26.01.06
Beiträge
555
Habe leider nochmal eine kleines Problem mit preg_replace. Und zwar will ich wieder wie oben, Text mit dem Inhalt einer Variable ersetzen (siehe erster Post).

Nach der Hilfe von Salzi funktioniert das auch alles soweit. Allerdings funktioniert das ganze nicht wenn in dem zu ersetzenden Teil ein § (Paragraphenzeichen) steht. Das Zeichen ist in der Variable UND im Text als HTML-Code maskiert. Muss man solche Zeichen speziell maskieren oder in den regulären Ausdrücken besonders beachten?

Grüße
duderino
 

Sir Q

Rheinischer Winterrambour
Registriert
12.04.05
Beiträge
923
Verständnisfrage
• Du hast einen Text: „Hallo, ich bin ein Blindtext - ich bin von Natur aus blind. Ich wurde Blind geboren und werde wohl auch blind sterben.”

• Du möchstest „blind” gegen „blöd” tauschen, aber „Blindtext” soll „Blindtext” bleiben.


Lösungsansatz
Wenn ich das so richtig verstanden habe, ist die Wahl zwischen schönem-code und effizenz im moment die:
a)
» Performant bei vielen Worten im Array und langem Text
1. Array mit Wort gegen Wort
2. Array mit „erlaubten Satzzeichen”
3. Merger-Function die ein neues Array generiert
4. strtr anstelle der regular-expression


b)
» Performant bei wenigen Worten und kürzerem Text
1. Array mit Wort
2. Array mit Gegenwort
3. regular_expression so bauen das [erlaubtezeichen]$array[erlaubtezeichen]
4. preg_replace


Beispiel für das Resultat aus a.3.

Wort gegen Wort ist eindeutiger als bei korrespondierenden Arrays
$wort_gegen_wort["Bier"] = "Uhuknie";
$wort_gegen_wort["kaufen"] = "rauben";


Erlaubte Zeichen definiert, welche Zeichen vorkommen dürfen
$erlaubte_zeichen = array(" ", ".");

Ergebnis nach dem Mergen durch eine selbst zu schreibende Funktion
" Bier " = " Uhuknie ";
" Bier." = " Uhuknie.";
".Bier " = ".Uhuknie ";
".Bier." = ".Uhuknie.";
" kaufen " = " rauben ";
" kaufen." = " rauben.";
".kaufen " = ".rauben ";
".kaufen." = ".rauben.";


Funktionsaufruf
$text = strtr($text, $wort_gegen_wort_merged);
 
Zuletzt bearbeitet:

duderino

Prinzenapfel
Registriert
26.01.06
Beiträge
555
Also:

Ich habe folgenden Text:
Hallo, ich bin ein Text ich will nicht viel und ich bin auch sehr anspruchslos.

Dann habe ich eine Datenbank mit ca. 1000 Begriffen. Diese Begriffe schreibe ich in ein Array und lass eine Schleife durchlaufen die den Text auf eines der gespeicherten Wörter durchsucht. Wenn ein Wort überein stimmt wird automatisch ein Link über das Wort gelegt. Das funktioniert auch soweit alles mit preg_replace.

Wenn ich jetzt allerdings folgenden Text habe:
Ich bin ein § im Ruhestand und mir gefällt es so wie es ist!

Und in der Datenbank steht z.B. "§ im Ruhestand", wird von meinem Script nicht erkannt dass es sich hier um 2 identische Inhalte handelt.

Hoffe das hilft weiter...
 

Sir Q

Rheinischer Winterrambour
Registriert
12.04.05
Beiträge
923
So?
$ersetzen["§ im Ruhestand"] = '<a href="http://....">§ im Ruhestand</a>';
$ersetzen["§123 GbG"] = '<a href="http://....">§123 GbG</a>';

$text = strtr($text, $ersetzen);
 

duderino

Prinzenapfel
Registriert
26.01.06
Beiträge
555
Joa, so sollte es gehen. Ob dieses Beispiel funktioniert weiß ich nicht, aber in meiner preg_replace funktioniert das nicht.