正则表达式(PHP / Perl)反向引用

时间:2011-11-30 01:32:03

标签: php regex perl

我想匹配表单的字符串:

  

第158,417,418,500,501及1111条

我将所有数字作为反向引用(用超链接替换它们)。我到目前为止:

$text = preg_replace_callback("/Sections? ([0-9.]+)(?:(?:and|,| |or)+([0-9.]+))+/","hyperlink_me", $text); 

这是PHP(使用符合perl的正则表达式)。 PHP部分很好我认为,正是这种正则表达式没有按照我想要的方式进行,但是我给出了上下文的整行代码。

问题是我得到的唯一两个反向引用(除了整个字符串)是第一个数字(“158”)和最后一个(“1111”)。似乎第二个被捕获的反向引用(“([0-9。] +”)刚刚从第二个数字开始写入。从this page,在“重复和反向引用”中,我认为这个通常是一个问题,但无法弄清楚如何在这种情况下解决它。任何可以提供帮助的正则表达式天才?

1 个答案:

答案 0 :(得分:1)

这就是捕获括号的工作原理,无法避免。但是你可以创建一个“助手”回调,hyperlink_us,这样做:

$output = preg_replace_callback("/[^0-9.]+([0-9.]+)/","hyperlink_me", $input);

然后你就像这样使用它:

$text = preg_replace_callback("/(Sections? [0-9.]+(?:(?:and|,| |or)+[0-9.]+)+)/","hyperlink_us", $text);

这样,hyperlink_us将所有数字传递给hyperlink_me,但hyperlink_us的调用者可以确保数字仅在适当的上下文中传递(“部分” ......“东西”。

(免责声明:我不是一个PHP-er。我假设这个函数的行为类似于JavaScript中的模拟。我知道Perl,但它没有基于回调的正则表达式替换函数。)