针对这样的字符串:

<h3>title</h3>
<h4>title</h4>

如何相应地匹配标签并获取其中的文本?

这有效,但它不必要地获取标签名称:
'@<(h[34])>(.+)</\1>@sU'

但是,这似乎不起作用,因为我不想获取标签名称而只想反向引用它:
'@<(?:h[34])>(.+)</\1>@sU'

我正在使用 PHP preg_match()。为什么第二种方法不起作用?是否可以反向引用非捕获组?

最佳答案

Capturing groups 稍后可以在正则表达式中用作对在该捕获组中匹配的内容的反向引用。通过将 ?: 放入其中,您可以指定不捕获组,而是对表达式进行分组。

您可以使用分支重置功能 (?| ... | ... ) 这样您的表达式就不会与非对应标签匹配,并且备选方案中的两个捕获组都被视为一个捕获组。

~(?|<h3>(.+?)</h3>|<h4>(.+?)</h4>)~s

Live Demo

关于php - 正则表达式反向引用非捕获组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25225179/

10-12 00:45