我正在尝试将具有相同名称的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)
答案 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]>%
这与以前不完全相同,但可能还不错。