正则表达式替换 - 节点之间的数量

时间:2014-02-11 07:06:02

标签: php regex

这是我的正则表达式:

\^((<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

后面的空格不大

编写替换变量的正确方法是什么?

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