gpt4 book ai didi

PHP 正则表达式 - 一组的重复匹配

转载 作者:可可西里 更新时间:2023-10-31 22:42:23 24 4
gpt4 key购买 nike

我有一个看起来像这样的字符串:

$r = 'Filed under: <a>Group1</a>, <a>Group2</a>';

这是我目前使用的正则表达式:

preg_match_all("/Filed under: (?:<a.*?>([\w|\d|\s]+?)<\/a>)+?/", $r, $matches);

我希望 () 中的正则表达式在末尾继续按照 +? 指定的方式进行匹配。但它就是做不到。::叹气::

任何想法。我知道必须有一种方法可以在一个正则表达式中执行此操作,而不是将其分解。

最佳答案

只是为了好玩,这里有一个正则表达式,可以与单个 preg_match_all 一起使用:

'%(?:Filed under:\s*+|\G</a>)[^<>]*+<a[^<>]*+>\K[^<>]*%`

或者,以更易读的格式:

'%(?:
Filed under: # your sentinel string
|
\G # NEXT MATCH POSITION
</a> # an end tag
)
[^<>]*+ # some non-tag stuff
<a[^<>]*+> # an opening tag
\K # RESET MATCH START
[^<>]+ # the tag's contents
%x'

\G匹配下一次匹配尝试开始的位置,这通常是上一次成功匹配结束的位置(但如果上一次匹配的长度为零,它会再向前移动一次)。这意味着正则表达式不会匹配以 </a> 开头的子字符串直到 之后 它匹配到以 Filed under: 开头的一个至少一次。

标记字符串或结束标记匹配后,[^<>]*+<a[^<>]*+>消耗直到并包括下一个开始标记的所有内容。然后 \K欺骗开始位置,因此匹配(如果有的话)似乎在 <a> 之后开始标签(这就像一个正面的回顾,但更灵活)。最后,[^<>]+匹配标签的内容并将匹配位置带到结束标签所以 \G可以匹配。

但是,正如我所说,这只是为了好玩。如果您必须在一个正则表达式中完成这项工作,您最好采用多步骤方法,例如@codaddict 使用的方法;它更具可读性、灵 active 和可维护性。

\K reference
\G reference

编辑:虽然我提供的引用资料是针对 Perl 文档的,但这些功能也受 PHP 支持,或者更准确地说,受 PCRE 库支持。我认为 Perl 文档要好一些,但您也可以在 PCRE manual 中阅读这些内容。 .

关于PHP 正则表达式 - 一组的重复匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2204946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com