我写了这段代码:
<?
$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
我做错了什么?请帮忙。谢谢
答案 0 :(得分:2)
您需要双重转义括号:
$patterns[0] = '/\\[b/';
PHP会在解析字符串时“消耗”单个反斜杠,只剩下一个裸[
,这将被正则表达式引擎视为字符类的开头。通过双重转义,PHP将\\
看作是一个转义,留下一个\
,这将被正则表达式引擎视为转义。
答案 1 :(得分:0)
您的问题与转义[
无关。您的问题是您希望$patterns[1]
仅匹配“/ b]”,但这不是您在正则表达式中所写的内容。
请尝试使用'/\/b]/'
,或使用其他分隔符(例如'!/b]!'
)来避免倾斜牙签综合征。