str_replace mit fortlaufender Nummer

DrBonsai

Mitglied
N´Abend.

Wie kann ich in der Funktion str_replace erreichen, dass der String jeweils durch die Nummer der Ersetzung ersetzt wird?
Also bei der ersten Ersetzung
str_replace('pagebreak', '1', $string), dann
str_replace('pagebreak', '2', $string) etc?

Danke schonmal und Gute Nacht.

mfg,
David
 
Vielleicht ist es mit preg_replace_callback machbar aber nicht mit str_replace denn das ersetzt ALLE vorkommen durch die selbe Ersetzung.
 
Hi

versuche doch das mal:
PHP:
<?php
error_reporting(E_ALL);
$str = "Ich wohne in einem Haus, Peter wohnt in einem Haus, Klaus wohnt in einem Haus.";
$i = 0;
$pre = "";
do{
  $i++;
  $pre = $str;
  $str = preg_replace("/einem Haus/","Haus".$i,$str,1);
}
while( $pre != $str );
echo $str; // Ich wohne in Haus1, Peter wohnt in Haus2, Klaus wohnt in Haus3
?>
 
@timestamp: Ich fürchte das wird nicht funktionieren.
Es macht nur einen Durchgang da du selbst $pre = $str setzt.

Wäre evtl machbar wenn man den String durchsucht und mit der position arbeitet. Also den String am Vorkommen splittet und wieder zusammensetzt.

Oder wie wäre es mit preg_split.
PHP:
<?php
$str = 'Ich wohne in einem Haus, Peter wohnt in einem Haus, Klaus wohnt in einem Haus.';
$parts = preg_split('/einem Haus/', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
$str = "";
for($i=0; isset($parts[$i+1]); $i++)
{
    $str .= $parts[$i][0]."Haus".($i+1);
}
$str .= $parts[$i][0];
echo $str; // Ich wohne in Haus1, Peter wohnt in Haus2, Klaus wohnt in Haus3 
?>
 
Zuletzt bearbeitet:
@timestamp: Ich fürchte das wird nicht funktionieren.
Es macht nur einen Durchgang da du selbst $pre = $str setzt.

Falsch! Ich habe es getestet, die Ausgabe kannst du in meinem Code sehen. Da $str nach dem zuweisen an $pre geändert wird, funktioniert die Schleife und läuft so lange durch, bis nichts mehr geändert wird ;)
 
Sehr eigenartig es geht tatsächlich.
Aber warum?
Rein vom logischen Ablauf müsste er beim ersten Durchlauf wieder raus gehen.
Da wäre eine Erklärung interessant.
 
Hi

eine sehr einfache Antwort gibt dir diese leichte Modifizierung :)
PHP:
<?php
error_reporting(E_ALL);
$str = "Ich wohne in einem Haus, Peter wohnt in einem Haus, Klaus wohnt in einem Haus.";
$i = 0;
$pre = "";
do{
  $i++;
  $pre = $str;
  $str = preg_replace("/einem Haus/",'Haus'.$i.'',$str,1);
  echo "PRE: ".$pre."<br />";
  echo "STR: ".$str."<br />";
  echo "<br />";
}
while( $pre != $str );
echo $str;
?>

Das liefer nämlich:
Code:
PRE: Ich wohne in einem Haus, Peter wohnt in einem Haus, Klaus wohnt in einem Haus.
STR: Ich wohne in Haus1, Peter wohnt in einem Haus, Klaus wohnt in einem Haus.

PRE: Ich wohne in Haus1, Peter wohnt in einem Haus, Klaus wohnt in einem Haus.
STR: Ich wohne in Haus1, Peter wohnt in Haus2, Klaus wohnt in einem Haus.

PRE: Ich wohne in Haus1, Peter wohnt in Haus2, Klaus wohnt in einem Haus.
STR: Ich wohne in Haus1, Peter wohnt in Haus2, Klaus wohnt in Haus3.

PRE: Ich wohne in Haus1, Peter wohnt in Haus2, Klaus wohnt in Haus3.
STR: Ich wohne in Haus1, Peter wohnt in Haus2, Klaus wohnt in Haus3.

Jetzt kann man eigentlich schon sehen was passiert.
$pre erhält den ursprünglichen Wert von $str. In der nächsten Zeile wird $str dann allerdings der Rückgabewert von preg_replace zugewiesen. So fern etwas ersetzt wurde, unterscheidet sich $pre nun natürlich von $str. Das ganze funkioniert nur, weil $pre _vor_ dem Funktionsaufruf $str zugewiesen bekommt.
 
Die Firma dankt,

ich hab es folgendermassen gemacht, aufbauend auf deiner Idee, timestamp

PHP:
	$pages = substr_count($text4, 'página string_pagina_page_number')+1;
	for ($page_number = 2; $page_number <=$pages; $page_number++)
	{
	$text5 = preg_replace('/string_pagina_page_number/', $page_number, $text4,1);
	$text4 = $text5;
	}

mfg,
David
 
Zurück