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 StelleProbieren 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