使用PHP如何将HTML实体()应用于preg_replace()调用中的反向引用?

时间:2010-06-06 22:19:28

标签: php regex

我有的时候:

$Text = preg_replace("/\[code\](.*?)\[\/code\]/s", "<mytag>\\1</mytag>", $Text);

如何使用htmlentities()逃避反向引用?

1 个答案:

答案 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\]