Funktion str_replace geht nicht in diesem Fall, weiß jemand wieso?

HaraldMenza

Grünschnabel
Hallo,

möchte eine Art Blacklist einbauen, also böse Wörter, die ersetzt werden sollen:

PHP:
<?

$Text = $_POST['text'];

$fp = fopen("poehse.txt", "r");
 while($poehseswort=fgets($fp,1024)) {
  $alle_poehsen_woerter[] = $poehseswort;
  }
fclose($fp);

$guteswort = "Liebling";


$Text = str_replace($alle_poehsen_woerter, $guteswort, $Text);

echo $Text;

?>

Leider funktioniert das Script nicht so richtig, denn es ersetzt die Wörter in der Datei nicht mit "Liebling" - hab schon probiert alle Variablen zu arrays zu machen und umgekehrt, hat auch nichts gebracht.

Hat jemand eine Idee?
 
Zuletzt bearbeitet:
Hmm.... soweit scheint alles korrekt zu sein, ich kann zumindest keinen Fehler finden ( und kann leider im Moment auch nicht ausprobieren ob es geht )....

Aber mal kurz nebenbei, warum nutzt du nicht str_ireplace?

Mal ne kurze Frage meinerseits, ist es möglich in PHP Variablen so über echo auszugeben?

Gruß
 
Mal ne kurze Frage meinerseits, ist es möglich in PHP Variablen so über echo auszugeben?

Ja, ist es.

Hast du mal testweise dein Array $all_poehsen_woerter ausgegeben?
[phpf]trim[/phpf] darauf angewendet um eventuelle Leerzeichen und Zeilenumbrüche zu entfernen?

[phpf]var_dump[/phpf] wird beim Testen des Arrays bestimmt helfen.
 
Das kann so nicht gehen du erstellst zuerst ein Array und versucht es dann mit str_replace auszulesen.

Für den Server würde die Zeile Text = str_replace($alle_poehsen_woerter, $guteswort, $Text);
lauten ersetze arry durch Liebling vom Text.

Um Arrys auszulesen muß du sie in einer Schleife ausgeben


PHP:
<?
$Text = $_POST['text'];

$fp = fopen("poehse.txt", "r");
 while($poehseswort=fgets($fp,1024)) {
  $alle_poehsen_woerter[] = $poehseswort;
  }
fclose($fp);
$guteswort = "Liebling";

foreach ($alle_poehsen_woerter as $inhalt){
 
   $Text = str_replace($inhalt, $guteswort, $Text);
}

echo $Text;
?>

Mfg Splasch
 
Zuletzt bearbeitet:
Das stimmt so nicht, Splasch.

php.net hat gesagt.:
mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )

Sind search und replace Arrays, nimmt str_replace() je einen Wert beider Arrays und verwendet diese zum Suchen und Ersetzen in subject . Hat replace weniger Werte als search , so wird ein leerer String zum Ersetzen für den Rest der Werte verwendet. Ist search ein Array und replace ein String, dann wird dieser String für jeden Wert von search angewandt. Das Gegenteil ist nicht sinnvoll.

Sind search und/oder replace Arrays, werden ihre Elemente vom ersten zum letzten hin verarbeitet.

[phpf]str_replace[/phpf]
 
Dann less mal unten dort genau weiter:


Zitat von php.net:

Das Verhalten der Funktion wurde verändert. Ältere Versionen enthalten einen Bug, der bei der Verwendung von Arrays für search und replace dazu führt, dass leere search -Indexe übersprungen werden, ohne dabei den internen Zeiger innerhalb des replace -Arrays ebenfalls weiter zu bewegen.

Ende:

Also wenn er nicht gerade die neue Version 5 hat.Dann gibst damit probleme bei der Ausgabe.

Mfg Splasch
 
Zuletzt bearbeitet:
Ja, alles vor Version 4.3.3, erschienen am 25. August 2003.

Wer damit noch arbeitet tut mir leid, da sowohl PHP 4.4.8 draußen ist als auch PHP 5.2.5, sprich genug Versionen um vernünftig arbeiten zu können.
 
Das Verhalten der Funktion wurde verändert. Ältere Versionen enthalten einen Bug, der bei der Verwendung von Arrays für search und replace dazu führt, dass leere search -Indexe übersprungen werden, ohne dabei den internen Zeiger innerhalb des replace -Arrays.
Dies hat in dem genannten Fall aber keinerlei Einfluss. Denn es gibt nur ein Such-Array und eine Ersatzzeichenkette, also kein Ersatz-Array. Damit ist es egal, ob die Funktion bei leeren Suchwörtern den Zeiger fürs Ersatz-Array weitersetzt oder nicht.
 
Danke euch erstmal.

Nee, also ich habe die Version 4.4.7. str_ireplace führt zur selben Problematik.

Kann es daran liegen, dass die erste Variable ein Array ist und die zweite nicht?

Das Array habe ich eben nochmal ausgegeben und es werden alle Wörter dargestellt, die in der Textdatei stehen, sind korrekt drin. Die Variable $guteswort ist auch ok, aber ersetzt wird es einfach nicht!?
 
Das Problem ist – wie Felix es bereits nannte – dass die Wörter im Array noch die Zeilenumbruchzeichen enthalten und diese erst entfernt werden müssten.
fgets()-Funktion hat gesagt.:
Die Zeile endet an einem Zeilenumbruch (welcher im Rückgabewert enthalten ist) […]
 
Zurück