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

4

对于这样的字符串:

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

如何匹配对应的标签并获取它们中的文本?
这个方法可以实现,但是它不必要地获取了标签名称:
'@<(h[34])>(.+)</\1>@sU'

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

我正在使用PHP preg_match()。为什么第二种方法不起作用?是否可能回溯引用一个非捕获组?


不,你不能反向引用不存在的内容。/.+\7/ 怎么可能工作呢?在你的第二个例子中,\1 将匹配 (.+) 的内容. - mario
@mario,那么如何使用正则表达式匹配HTML标签及其中的内容呢?这里有什么常见的做法吗? - datasn.io
2
你应该使用 DOM 解析器而不是正则表达式。 - hjpotter92
@hjpotter92,即使是格式不正确的DOM文档?我认为使用正则表达式更通用,这样我就不会因为破碎的DOM而感到恐慌。此外,我可能还需要解析一些不同于XML / HTML文档但具有类似模式的普通字符串。 - datasn.io
@kavoir.com https://dev59.com/glfUa4cB1Zd3GeqPGUeR - hjpotter92
不要使用正则表达式解析X/HTML。不要使用正则表达式解析X/HTML。不要使用正则表达式解析X/HTML。我是否提到不要使用正则表达式解析X/HTML? - Qix - MONICA WAS MISTREATED
1个回答

2
捕获组”可以在正则表达式中作为回溯引用后面使用,以引用在该捕获组中匹配的内容。通过在内部放置?:,您可以指定不捕获该组,而是对表达式进行分组。
您可以使用分支重置功能(?| ... | ... ),这样您的表达式就不会匹配不对应的标记,并且两个备选项中的捕获组都被视为一个捕获组。
~(?|<h3>(.+?)</h3>|<h4>(.+?)</h4>)~s

"

现场演示

"

我没有这样做。为什么要用 .+? 而不是只用 **.+**? - datasn.io
1
因为没有使用U修饰符,所以.+是贪婪的,这意味着如果有多个标签,它将继续匹配。 - hwnd
所以 .+?.+ 的非贪婪版本 ? - datasn.io
<(?:h[34])>(.+?)</(?:h[34])>s是否也匹配不对应的标签? 比如 <h3>...</h4>? - datasn.io
谢谢您的更新,但如果我们有一种通用的方法来使用正则表达式匹配HTML标签,那将会更好。我简直不敢相信这是如此困难! - datasn.io
我猜想,那么在不捕获标签名称的情况下,很难想出一种通用的正则表达式匹配HTML标签的方法? - datasn.io

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接