Я обновляю свое кодирование и preg_replace
от preg_replace
к функции preg_replace_callback
. На первом я использовал два массива, которые заменили все совпадения в части текста.
Я установил следующий новый фрагмент кода, но у меня возникают некоторые проблемы:
<?php
$inhoud = " dit is een test versie, waarin [alum] staat [alum] & [fotoalbums] om [intern=test]te[/intern] vervangen<p>";
function parse_callback($match) {
$hit = $match[0];
switch ($hit){
case '[alum]':
return "<a href=\"/linktype1/\">link1</a>";
break;
case '[fotoalbums]':
return "<a href=\"/linktype2/\">link2</a>";
break;
case '[intern]':
return "<a href=\"". $match[1] ."\">$match[2]</a>";
break;
default:
//return "UNKNOWN:$match";
return var_dump($match);
}
}
$Patroon = "'\[intern=(.*?)\](.*?)\\[\/intern\]'";
$Patroon = "'\[fotoalbums\]'";
$Patroon = "'\[alum\]'";
$inhoud = preg_replace_callback($Patroon, parse_callback, $inhoud);
?>
Последние два в $Patroon
являются проблемой, они будут обновлены, но я не могу обновить первый, поскольку найденное совпадение будет полной строкой. $match
также будет содержать фрагменты текста от $inhoud
на который совпал (.*?)
, Но я не смог обработать их в коммутаторе.
Любые предложения по устранению этой проблемы или лучшему подходу к кодированию. Вышеприведенный пример - это всего лишь несколько вариантов, которые будут сопоставлены, фактический список намного больше.
Прежде всего, вы должны передать имя функции в виде строки: "parse_callback"
.
Как вы заметили, match[0]
вернет весь согласованный текст ("[intern=test]te[/intern]"
). Вы можете записать имя тега в группе:
$Patroon = "'\[(intern)=(.*?)\](.*?)\[/intern\]'";
(intern)
Таким образом, имя тега будет возвращено $match[1]
.
И используя этот подход ко всем шаблонам:
$Patroon = array(
"'\[(intern)=(.*?)\](.*?)\[/intern\]'",
"'\[(fotoalbums|alum)\]'"
);
Код
<?php
$inhoud = " dit is een test versie, waarin [alum] staat [alum] & [fotoalbums] om [intern=test]te[/intern] vervangen<p>";
function parse_callback($match) {
//check the value of the first capture
$hit = $match[1];
switch ($hit){
case 'alum':
return "<a href=\"/linktype1/\">link1</a>";
break;
case 'fotoalbums':
return "<a href=\"/linktype2/\">link2</a>";
break;
case 'intern':
return "<a href=\"$match[2]\">$match[3]</a>";
break;
default:
//return "UNKNOWN:$match";
return var_dump($match);
}
}
$Patroon = array(
"'\[(intern)=(.*?)\](.*?)\[/intern\]'",
"'\[(fotoalbums|alum)\]'"
);
$inhoud = preg_replace_callback($Patroon, "parse_callback", $inhoud);
echo $inhoud;
?>
Вывод
dit is een test versie, waarin <a href="/linktype1/">link1</a> staat <a href="/linktype1/">link1</a> & <a href="/linktype2/">link2</a> om <a href="test">te</a> vervangen<p>