preg_replace () --> Ersetzungen nummerieren

Frezl

Erfahrenes Mitglied
Salü allerseits,

ich brauch eure Hilfe! Ich such jetzt schon den ganzen Abend nach ner Lösung, wie ich die Ersetzungen, die ich mit preg_replace () mache, durchnummerieren kann. Das ganze soll dann z. B. so aussehen:

[ DIV ]BliBlaBlubb[ /DIV ] --> <div id="nr_1">BliBlaBlubb</div>
[ DIV ]Trallala[ /DIV ] --> <div id="nr_2">Trallala</div>
(usw.)

// Die Leerzeichen vor und nach DIV hab ich nur eingefügt, damit das Forum damit keinen Quatsch anstellt...

Es war nicht sehr schwer, die Ersetzung hinzubekommen, das hab ich mit folgendem RegEx gelöst:

$output = preg_replace ('%\[DIV\](.+?)\[/DIV\]%i', '<div>\1</div>', $input);

Aber ich hab nirgends ne Erklärung gefunden, wie ich die Nummerierung einbauen könnte. Gibt irgend nen Zähler bei preg_replace (), der anzeigt, die wie vielte Ersetzung grade gemacht wird? Also sowas in der Art:

$output = preg_replace ('%\[DIV\](.+?)\[/DIV\]%i', '<div id="nr_$n">\1</div>', $input);

Wäre für einen kleinen Denkanstoß dankbar!

Viele Grüße,
Frezl
 
Zuletzt bearbeitet:
Ich hab das Problem jetzt erst mal auf diese wenig elegante Weise gelöst:

PHP:
	$regex = '%\[DIV\](.+?)\[/DIV\]%i';
	
	preg_match_all ($regex, $input, $n);
	
	$replacement = array ();
	$regex = array ();
	
	for ($i = 0; $i < count ($n); $i++) {
		$regex[] = '%\[youtube\](.+?)\[/youtube\]%i';
		$replacement[] = '<div id="nr_'.($i+1).'>\1</div>';
	}
	
	$output = preg_replace ($regex, $replacement, $input, 1);

Wenig elegant find ich die Lösung aus zwei Gründen:
a) ich muss zwei mal den RegEx drüberlaufen lassen, was die Performance nicht gerade erhöht.
b) in das Array $regex schreib ich auf jeder Position das gleiche rein, was irgendwie Unsinn ist, aber anders nicht geht.

Wenn also jemand eine elegantere Idee weiß, dann möge er sie mir bitte mitteilen!

Viele Grüße,
Frezl
 
Hey Timestamp,

vielen Dank für den Tipp! Leider komm ich mit der Funktion nicht so ganz zurecht :-/ Wie kann ich in der Callback-Funktion auf den Count zugreifen?

Viele Grüße,
Frezl
 
Guck dir mal die Beispiele unten an, die Callbackfunktion wird als zweiter Parameter angegeben ;)

PHP:
$str = "<p>Ein Paar Absätze</p><p>Noch einer</p><p>Und noch einer</p>";
function callback($match){			
	static $a = 0;
	$a++;
	return $a." ".$match[1].'<br />';
}
echo preg_replace_callback('/<p>(.*)<\/p>/U','callback', $str);
?>
 
Achsooo, man muss innerhalb der callback-Funktion nen eigenen Counter einbaun. Ich dacht, man kann auf den letzten Parameter &$Count zugreifen.

Vielen Dank, ich werd das nachher gleich mal testen...

Grüße,
Frezl

// EDIT: Getestet und für gut befunden :-)

Die Lösung sieht jetzt deutlich eleganter aus, als bei meinem ersten Versuch:
PHP:
$regex = '%\[DIV\](.+?)\[/DIV\]%i';

function callback ($match) {
	
  static $n;		
  $n++;

  return '<div id="nr_'.$n.'">'.$match[1].'</div>';

}

$output = preg_replace_callback ($regex, "callback", $input);

Ich werd mir wohl das Wesen der Callback-Funktion noch mal etwas genauer anschauen müssen, um zu verstehen, wie genau die aufgerufen wird. Aber fürs Erste reicht das mal.

Vielen Dank für die Hilfe!
 
Zuletzt bearbeitet:
Zurück