Php 正则表达式反向引用非捕获组?

Php 正则表达式反向引用非捕获组?,php,regex,Php,Regex,针对这样的字符串: <h3>title</h3> <h4>title</h4> 标题 标题 如何相应地匹配标签并获取其中的文本 这可以工作,但不必要地获取标记名: '@<(h[34])>(.+)</\1>@sU' “@(+)@sU” 但是,这似乎不起作用,因为我不想获取标记名,只想反向引用它: '@<(?:h[34])>(.+)</\1>@sU' “@(+)@sU” 我正在使用PHP pr

针对这样的字符串:

<h3>title</h3>
<h4>title</h4>
标题
标题
如何相应地匹配标签并获取其中的文本

这可以工作,但不必要地获取标记名:

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

'@<(?:h[34])>(.+)</\1>@sU'
“@(+)@sU”
我正在使用PHP preg_match()。为什么第二种方法不起作用?是否可以对非捕获组进行反向引用?

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

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

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

不,您不能反向引用不存在的内容。
/.+\7/
如何工作?您的第二个示例
\1
将与
(.+)
内容匹配。@mario,那么如何使用正则表达式匹配HTML标记和其中的内容呢?这里有什么常见的做法吗?使用DOM解析器而不是regex@hjpotter92,即使是格式错误的DOM文档?我认为使用正则表达式更为普遍,这样我就不会对坏掉的DOM发狂。另外,我可能还需要解析XML/HTML文档以外的内容,但需要解析具有类似模式的普通字符串。@kavoir.com我没有这样做。为什么?但不仅仅是。+?因为没有
U
修饰符
+
是贪婪的意思,如果有超过1个标记,它将继续匹配。那么。+?(.+?)~s的ungreedy版本是否也匹配非对应的标记?例如…?感谢您的更新,但是如果我们有一个通用的方法将HTML标记与正则表达式匹配,那就更好了。真不敢相信这么难!