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

正则表达式(PHP/Perl)反向引用,php,regex,perl,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、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.]+”)正从第二个数字开始写入。从,在“重复和反向引用”处,我认为这通常是一个问题,但不知道如何在这种情况下解决它。任何能提供帮助的正则表达式天才?

这就是捕获括号的工作原理,无法避免。但您可以创建一个“helper”回调,
hyperlink\u 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\u-us
将所有数字传递给
hyperlink\u-me
,但是
hyperlink\u-us
的调用者可以确保数字只在适当的上下文中传递(“部分…”之类的内容)


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

谢谢!我主要是想知道反向引用是如何工作的,而且我没有遗漏任何正则表达式技巧。我实际上使用了PHP函数的组合(preg\u match\u all,str\u replace)在我的hyperlink_me函数中,我可以按照你的建议做同样的事情。@joseph_morris:不客气!是的——Perl兼容正则表达式,就像所有Perl的东西一样,充满了神奇的细微差别,很容易让人认为它们在每种场合都必须有一个新的技巧,而事实上,它们在99%的场合只有一个新的技巧。另一个1%,我们得设法混过去-(