我正在尝试将具有相同名称的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"都将设置为它.
只是将知识贡献给宇宙
你可以像这样组合它们:
%<div (class="artikkelen"|id="article")>[\s\S]*?<h[12]>(?P<title>[\s\S]*?)</h[12]>%
Run Code Online (Sandbox Code Playgroud)
这与以前不完全相同,但可能已经足够好了。