EisFuX: preg_replace()

Beitrag lesen

(Hallo|Hi(ho)|Tag|Mahlzeit|Yo, Yo{2,3}) Pit Stop,

Ich habe einen Link, den ich ändern möchte/muß.

Dieser Link wird dynamisch generiert, daher die ID in dem Link.

Was willst du denn ändern: das id-Attribut oder bspw. das Linkziel (href-Attribut)?

Über str_replace komme ich dasher ja nicht weiter, weil ich ja keine feste Zeichenkette habe, sondern eine "wechselnde";-)

Klar kann dir da preg_replace() weiterhelfen. Nur wenn du damit noch nie zu tun hattest, dann musst du dich wohl oder übel in die Thematik [(Perl-kompatible) Reguläre Ausdrücke](file://localhost/e:/data/info-rsrc/webdev/php/php.net/www.php.net/manual/de/regexp.reference.php) einlesen ...

Für das Beispiel weiter unten brauchst mindestens Kenntnisse

  • zu Zeichenklassen generell "[...]"
  • zu "negierten" Zeichenklassen "[^...]"
  • zur Zeichenklasse "\s"
  • zu den Quantifikatoren ("Zählern") "+" und "*"
  • zu Subpatterns "(...)"
    und zu allem, was ich jetzt möglicherweise übersehen habe- ;-)

zu 3.) wie soll ich die ID ala Parameter übergeben?

Für den Fall, dass du die URL im href-Attribut (das auf das id-Attribut folgt) ersetzen möchtest, etwa so:

  
function meine_ersetzungsfunktion(  
  $id,             /// deine ID  
  $womit_ersetzen, /// die neue URL  
  $worin_ersetzen  /// dein HTML-Quelltext  
) {  
  // prüfung übergebener Werte auf Sinnhaftigkeit  
  ...  
  // $womit_ersetzen muss "escaped" werden, falls $ oder \ drin vorkommen  
  ...  
  return preg_replace(  
      '/(\s+id="'.preg_quote($id).'"\s+href=")[^"]*(")/',  
      '$1' . $womit_ersetzen . '$2',  
      $worin_ersetzen);  
}  

Das funktioniert aber nur dann wie gewünscht, wenn die ID nur einmal so im (HTML?-)Quelltext vorhanden ist. Das sollte zwar in validem HTML so sein, aber man weiß ja nie ... ;-) Probeweise kannst du dir das mit preg_match_all() bestätigen lassen:

  
if (preg_match_all('/\s+id="'.preg_quote($id).'"/', $wo_ersetzen, $treffer)) {  
  var_dump($treffer);  
}  

... oder in HTML:

  
if (preg_match_all('/\s+id="'.preg_quote($id).'"/', $wo_ersetzen, $treffer)) {  
  ob_start();  
  var_dump($treffer);  
  printf('<pre>%s</pre>', htmlspecialchars(ob_get_clean()));  
}  

MffG
EisFuX