我有的时候:
$Text = preg_replace("/\[code\](.*?)\[\/code\]/s", "<mytag>\\1</mytag>", $Text);
如何使用htmlentities()
逃避反向引用?
答案 0 :(得分:2)
$Text = "foo [code]bla<br>bla[/code] foo";
echo preg_replace_callback('/\[code\](.*?)\[\/code\]/s', 'wrap_code', $Text);
function wrap_code($matches) {
return '<mytag>'.htmlspecialchars($matches[1]).'</mytag>';
}
如preg_replace_callback()
documentation所示,您还可以通过create_function()
或PHP 5.3.0创建内联回调函数,甚至可以使用anonymous function。
然而,通用方法将遵循以下原则:
$Text = "foo [code]bla<br>bla[/code] foo";
$re_bbcode = '/\[(code|b|whatever)\](.*?)\[\/\1\]/s';
echo preg_replace_callback($re_bbcode, 'wrap_code', $Text);
function wrap_code($matches) {
switch ($matches[1]) {
case 'code': $tag = 'mytag'; break;
case 'b' : $tag = 'b'; break;
default : $tag = '';
}
if ($tag != '')
return "<$tag>".htmlspecialchars($matches[2])."</$tag>";
else
return htmlspecialchars($matches[0]);
}
此外,我猜(我还没有测量过)这个正则表达式可能会更快一些,因为不太需要调用不情愿的量词:
\[(code|b|whatever)\]([^\[]+|.*?)\[\/\1\]