这是我的正则表达式:
\^((<i><b>|<b><i>)(\d+)(\<\/b>\<\/i>|\<\/i>\<\/b>))?\s+/mi
应该抓住<i><b>14</b></i> some text
好消息是它将<i><b>14</b></i>
捕获为\1
,这是我对该功能的第1步所需要的。
坏消息是我无法弄清楚如何编写替换变量以捕获14
并将其替换为数字1
我尝试的是\21\4
,其中\2
代表<i><b>
而\4
代表</b></i>
,但整个事情被解释为\21
不是\2
。我\2
编写替换变量的正确方法是什么?
答案 0 :(得分:1)
您可以使用此基于外观的正则表达式:
$re = '~(?:<[bi]>)*\b(\d+)\b(?:</[bi]>)*~m';
$str = preg_replace($re, '$0 :: $1', '<i><b>14</b></i>');
//=> <i><b>14</b></i> :: 14
虽然使用DOM解析器解析HTML然后操作它会更安全。
答案 1 :(得分:1)
直接回答您的问题:为了消除反引用$2
和来自反引用1
的数字$21
的歧义,您可以使用大括号:
${2}1