suit: preg_replace, Teilstring einsetzen

Beitrag lesen

so gerne ich preg_replace für solche Sachen verwende, sosehr ist es dafür eigentlich nicht gedacht.

Doch, genau dafür ist preg_replace gedacht ;)

Ich habe folgenden Text "Das ist ein LINK999TestlinkLINKOUT der verlinkt werden soll".

Du suchst ("match") nach zwei Elementen in einer Zeichenkette:

1.) eine dreistellige Zahl (lassen wir sie auch gerne x-stellig sein)
2.) einem Wort an einer bestimmten Stelle

Probieren wir das einmal mit der Funktion preg_match:

$o = '';

$l = '';
$s = 'Das ist ein LINK999TestlinkLINKOUT der verlinkt werden soll';
$link = $s;

if (false !== preg_match('~LINK(\d+)(\w+)LINKOUT~', $s, $found)) {

$o = $found[1];
    $l = $found[2];

// create clickable link
    $link = sprintf(
        '<a class="linkout" href="http://example.com/editorial.php?o=%1$d">%2$s</a>',
        $o,
        htmlspecialchars($l)
    );
}


>   
> Das mit preg\_match [hatte wohl suit auch gemeint](https://forum.selfhtml.org/?t=215507&m=1476071)...  
  
Nein, hatte ich nicht - deine Krücke mit sprintf + preg\_match kannst du in diesem Fall sparen, für genau diesen Fall gibt es preg\_replace  
  
~~~php
<?php  
  $string      = 'Das ist ein LINK999TestlinkLINKOUT der verlinkt werden soll';  
  $pattern     = '~LINK(\d+)(\w+)LINKOUT~';  
  $replacement = '<a class="linkout" href="http://example.com/editorial.php?o=\1">\2</a>';  
  echo preg_replace($pattern, $replacement, $string);  
?>

\d+ matcht auf eine Dezimalziffernfolge - also besteht keine Gefahr, dass hier irgendwas daherkommt was den Link kaputt macht; \w+ < > " ' oder & sind für PCRE keine Word-Zeichen (egal wie absurd die locale-Einstellungen grade sind), also auch hier gibts keine Probleme - das htmlspecialchars() ist hier also auch nicht notwendig.

Wer allerdings kein UTF-8-Dokument verschickt kann ggf. mit Zeichen oberhalb #128 Probleme bekommen, wenn das das verwendete Encoding nicht kann. Ggf. braucht man hier dann ein htmlentities() oder aber ein preg_replace_callback