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

时间:2009-09-14 09:56:21

标签: php regex

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

  

警告:preg_match():编译   失败:两个命名的子模式有   偏移量为276的同名......

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

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

另一个看起来像这样:

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

我可以毫无问题地以下列方式组合它们:

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

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

最诚挚的问候, Box(boxoft ...... Simple&amp; Great)

2 个答案:

答案 0 :(得分:28)

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

  

重复名称

     

如果使用命名模式,只要在模式中添加“(?J)”选项,就可以多次使用相同的名称。例如:

    Match: (?J)(?P<name>Ni.+)|(?P<name>Fr.+)
  

这将匹配“Nick”或“Fred”,无论哪一个匹配,都会将命名模式“name”设置为它。

只是将知识贡献回宇宙

答案 1 :(得分:0)

您可以将它们组合起来代替:

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

这与以前不完全相同,但可能还不错。