Извините за заголовок, честно говоря, не знаю, как его правильно объяснить.
Я делаю небольшую функцию шорткода, которая должна заменить шорткоды выводом html.
preg_match_all находит все, что мне нужно, но preg_replace заменяет одно и то же совпадение снова и снова. Вот демо https://eval.in/139727
Я уверен, что сделал беспорядок в этих циклах foreach, но просто не могу понять это.
$text = 'Some text and some [link link="linkhref1" text="Text1"],[link link="linkhref2" text="Text2"]';
function shortcodes($text) {
$shortcodes = array(
'link' => array(
"check" => "[link",
"type" => "link",
"match" => "#\[link(.*?)link\=\"(.*?)\"(.*?)text\=\"(.*?)\"#Ui",
"replace" => "/\[link(.*?)\]/s"
)
);
foreach ($shortcodes as $index => $shortcode) {
if (strpos($text, $shortcode['check']) !== false) {
$text = shortcode_replace($shortcode, $text);
}
}
return $text;
}
function shortcode_replace($shortcode, $text) {
$replacement = '';
preg_match_all($shortcode['match'], $text, $matches);
switch ($shortcode['type']) {
case "link":
foreach ($matches[4] as $index => $match) {
$link = $matches[2][$index];
$linktext = $matches[4][$index];
$replacement .= '<a href="' . $link . '">' . $linktext . '</a>';
$text = preg_replace($shortcode['replace'], $replacement, $text);
}
}
return $text;
}
echo shortcodes($text);
любая помощь приветствуется!