最近我一直在学习(说实话,更多的是在实践中)正则表达式,我注意到它的强大。这个要求是我提出的(链接),我知道"反向参考"。我想我明白它是如何工作的,它在JavaScript中工作,而在PHP中不是。
例如,我有这个字符串:
[b]Text B[/b]
[i]Text I[/i]
[u]Text U[/u]
[s]Text S[/s]
并使用以下正则表达式:
'[(b|i|u|s)']'s*(.*?)'s*'['/'1']
在regex101.com上测试它可以工作,对JavaScript也是一样,但对PHP不起作用。
preg_replace
(不工作)示例:
echo preg_replace(
"/'[(b|i|u|s)']'s*(.*?)'s*'['/'1']/i",
"<$1>$2</$1>",
"[b]Text[/b]"
);
echo preg_replace(
"/'[(b|i|u|s)']'s*(.*?)'s*'['/(b|i|u|s)']/i",
"<$1>$2</$1>",
"[b]Text[/b]"
);
我不明白我错在哪里,感谢所有帮助我的人。
这是因为您使用了双引号字符串,在双引号字符串中,'1
被读取为字符的八进制表示法(控制字符SOH = heading的开始),而不是作为转义的1。
有两种方式:
'/'[(b|i|u|s)']'s*(.*?)'s*'['/'1']/i'
或转义反斜杠以获得字面值反斜杠(用于字符串,而不是用于模式):
"/'[(b|i|u|s)']'s*(.*?)'s*'['/''1']/i"
作为题外话,你可以这样写你的模式:
$pattern = '~'[([bius])]'s*(.*?)'s*'[/'1]~i';
// with oniguruma notation
$pattern = '~'[([bius])]'s*(.*?)'s*'[/'g{1}]~i';
// oniguruma too but relative:
// (the second group on the left from the current position)
$pattern = '~'[([bius])]'s*(.*?)'s*'[/'g{-2}]~i';