反向引用在PHP中不起作用


Backreference does not work in PHP

最近我一直在学习(说实话,更多的是在实践中)正则表达式,我注意到它的强大。这个要求是我提出的(链接),我知道"反向参考"。我想我明白它是如何工作的,它在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';