assoziativer Index in einem preg_replace();

Crusade

Grünschnabel
Betreffend einem assoziativen Index in einem regulären Ausdruck hab ich mich irgendwie festgefahren.. .
Mit preg_match(); und preg_match_all(); gibt es in der Anwendung keinerlei Probleme, allerdings komm ich bei preg_replace(); nicht weiter.

als Beispiel:
PHP:
  $subject = 'die eierlegende Wollmilchsau';
  $pattern = '#(?P<index>eier)#i';


  $replace = '${1}';
  $result = preg_replace($pattern, $replace, $subject);
  // ergibt: die eierlegende Wollmilchsau
  
  $replace = '${index}';
  $result = preg_replace($pattern, $replace, $subject);
  // ergibt: die ${index}legende Wollmilchsau

Kann php dies nicht umsetzen oder ists einfach nur ein Anwendungsfehler ?
 
Zuletzt bearbeitet:
Moin,

meinst du so?
Code:
  $eier='riesigedampfendehaufen';
  
  $subject = 'die eierlegende Wollmilchsau';
  $pattern = '#(?P<index>eier)#ei';
 
  $replace = '${$1}';
  $result = preg_replace($pattern, $replace, $subject);
  echo $result;

oder so?
Code:
<?php
  $index='riesigedampfendehaufen';
  
  $subject = 'die eierlegende Wollmilchsau';
  $pattern = '#(?<index>eier)#ei';
 
  $replace = '${index}';
  $result = preg_replace($pattern, $replace, $subject);
  echo $result.'<hr>';
?>
?

Egal wie, einen Bezug zu dem Namen bekommst du direkt in preg_replace() nicht hergestellt, denn beide Beispiele funktionieren auch ohne die Subpattern....der Name ist ja kein gefundenes Suchmuster, welches man referenzieren könnte.
 
Auch wenn es nichtmehr ganz zum Thementitel passt...

Ich hab mich "früher" mit den Regex-Grundlage beschäftigt und versuche mich nur wieder einzulesen.
Mittlerweile habe ich fast jede Dokumentation zu diesem Thema durch und scheitere dennoch seit geraumer Zeit an folgendem Problem.

Problematik:
Ich habe einen beliebig langen Sting, der beliebig viele HTML-Tags in willkürlicher Reihenfolge enthalten kann.

zum Beispiel
Code:
Administrator, admin<a href="mailto:root@administrator.de">Useradministration</a>

Ich möchte in dem Beispiel nun den String admin über preg_replace(); auf <b>admin</b> erweitern.
Bedingung ist nun, dass Treffer innerhalb einem HTML-Tag ignoriert werden sollen und alles mit einem regulären Ausdruck umgesetzt werden soll.

Mein Lösungsansatz sieht momentan vor admin zu finden, der von einem HTML-Tag gefolgt werden kann aber nicht muss.
http://regexp-evaluator.de/evaluator/f864b15805b49a122c320345a165f89f/#ergebnis

Nur scheitert es hier sofort daran sobald sich etwas ändert.
http://regexp-evaluator.de/evaluator/a78d5092eb1952edd98ff4d4a25ced01/#ergebnis

( Und da gehe ich nur auf eine mögliche Änderung ein... . :rolleyes: )

Andere Lösungsansätze beinhalteten Lookbehind-/Lookahead-Assertionen sowie bedingte Unterausdrücke.

Auch wenn es eigentlich einfach sein sollte komm ich einfach nicht auf die Lösung, weshalb ich mich an euch wende.
 
Danke für diese schnelle Antwort,

den Ansatz hatte ich auch bereits verfolgt, scheiterte leider nur daran, dass der String HTML-Tags enthalten kann aber nicht muss sowie das Wort admin beliebig oft zwischen/vor/nach einem HTML-Tag stehen kann.

[Edit]
Ich habs nun wie folgt gelöst.
PHP:
  $subject = 'Administrator,admin  <a href="mailto:root@administrator.de">Useradministration</a>';
  $pattern = '#(<[^>]+>|admin)#i';
  $result = preg_replace_callback(
  	$pattern,
  	create_function(
  		'$treffer',
  		'if (strtolower($treffer[0]) == "admin") {
  			return "<b>".$treffer[0]."</b>";
  		} else {
  			return $treffer[0];
  		};'
    ),
  	$subject
  );
  echo $result;
 
Zuletzt bearbeitet:
Zurück