繁体   English   中英

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

[英]Regular Expression (PHP/Perl) Backreferences

我想匹配以下形式的字符串:

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_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可以确保数字只在适当的上下文传递(以下简称“科(S)...”的东西)。

(免责声明:我不是一个PHP-er,我假设此函数的行为类似于JavaScript中的类似函数。我确实知道Perl,但它没有基于回调的regex-replacement函数。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM