我正在更新我的编码并从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
上匹配(.*?)
的文本,但我无法在切换中处理这些文本。
有关如何解决此问题或更好的编码方法的任何建议。 上面的例子只是几个匹配的选项,实际列表要大得多。
答案 0 :(得分:2)
首先,您应该将函数名称作为字符串传递:"parse_callback"
。
正如您所注意到的,match[0]
将返回整个匹配的文字("[intern=test]te[/intern]"
)。您可以在group中捕获标记名称:
$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>