preg_replace - 如何逃避“[”

时间:2011-07-28 21:03:34

标签: preg-replace

我写了这段代码:

<?
$text='how are you [b] today [/b]';
$patterns = array();
$patterns[0] = '/\[b/';
$patterns[1] = '/\b]/';
$replacements = array();
$replacements[1] = 'b]aaa<>';
$replacements[0] = '<>aaa[b';


ksort($patterns);
ksort($replacements);
echo preg_replace($patterns, $replacements, $text);
echo "_";
echo $text;
echo "_";
echo "END";

?>

输出显示:

how are you <>aaa[bb]aaa<> today [/b]aaa<>______how are you [b] today [/b]______END

但输出应为:

how are you <>aaa[b] today [/b]aaa<>______how are you [b] today [/b]______END

我做错了什么?请帮忙。谢谢

2 个答案:

答案 0 :(得分:2)

您需要双重转义括号:

$patterns[0] = '/\\[b/';

PHP会在解析字符串时“消耗”单个反斜杠,只剩下一个裸[,这将被正则表达式引擎视为字符类的开头。通过双重转义,PHP将\\看作是一个转义,留下一个\,这将被正则表达式引擎视为转义。

答案 1 :(得分:0)

您的问题与转义[无关。您的问题是您希望$patterns[1]仅匹配“/ b]”,但这不是您在正则表达式中所写的内容。

请尝试使用'/\/b]/',或使用其他分隔符(例如'!/b]!')来避免倾斜牙签综合征。

相关问题