将2个正则表达式合并为一个时,得到"两个命名的子模式具有相同的名称"

box*_*oft 4 php regex

我正在尝试将具有相同名称的2个不同正则表达式合并为一个,并得到如下错误消息:

警告:preg_match():编译失败:两个命名的子模式在偏移276处具有相同的名称...

一个正则表达式看起来像这样:

'%<div class="artikkelen">[\s\S]*?<h2>(?P<title>[\s\S]*?)</h2>%'
Run Code Online (Sandbox Code Playgroud)

另一个看起来像这样:

'%<div id="article">[\s\S]*?<h1>(?P<title>[\s\S]*?)</h1>%'
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式将它们组合而不会出现问题:

'%(<div class="artikkelen">[\s\S]*?<h2>(?P<title>[\s\S]*?)</h2>|<div id="article">[\s\S]*?<h1>(?P<title2>[\s\S]*?)</h1>)%'
Run Code Online (Sandbox Code Playgroud)

但我不喜欢这种方式因为我使用了两个名字.我想知道是否有更好的方法来解决这个问题.提前致谢.

最诚挚的问候,盒子(boxoft ...简单和伟大)

小智 28

我发现这个页面正在寻找一种方法,让两个(或更多?)命名的子模式具有相同的名称,我找到了这个页面的答案(相关摘录在这里)

名称重复

如果使用命名模式,则现在可以多次使用相同的名称,前提是在模式中添加"(?J)"选项.例如:

    Match: (?J)(?P<name>Ni.+)|(?P<name>Fr.+)
Run Code Online (Sandbox Code Playgroud)

这将匹配"Nick"或"Fred",无论哪一个匹配,命名模式"name"都将设置为它.

只是将知识贡献给宇宙

  • 这是维护所有要求的问题的实际解决方案. (3认同)
  • (?J)`为模式的其余部分启用正则表达式修饰符。您也可以将J作为常规修饰符传递给preg_match()和Co;。即`/(?P &lt;name&gt; Ni。+)|(?P &lt;name&gt; Fr。+)/ J`,如此处所述:http://php.net/manual/zh/reference.pcre.pattern .modifiers.php (2认同)

Gre*_*reg 0

你可以像这样组合它们:

%<div (class="artikkelen"|id="article")>[\s\S]*?<h[12]>(?P<title>[\s\S]*?)</h[12]>%
Run Code Online (Sandbox Code Playgroud)

这与以前不完全相同,但可能已经足够好了。