代码之家  ›  专栏  ›  技术社区  ›  boxoft

将2个regex合并为一个regex时得到“两个命名的子模式同名”

  •  4
  • boxoft  · 技术社区  · 17 年前

    我尝试将两个具有相同名称的不同regex组合成一个,并收到如下错误消息:

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

    一个regex如下:

    '%<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…简单&很棒)

    2 回复  |  直到 15 年前
        1
  •  0
  •   Greg    17 年前

    您可以这样组合它们:

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

    这和以前不完全一样,但可能足够好。

        2
  •  27
  •   Electric Darrell    15 年前

    我发现这个页面正在寻找一种方法来拥有两个(或更多?)用相同名称命名的子模式,我发现 this page 带答案(此处相关摘录)

    重复名称

    如果您使用的是命名模式,那么您现在可以多次使用相同的名称,只要您将“(?”j)“你的模式中的选项。例如:

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

    这将匹配“nick”或“fred”,并且无论哪个匹配,命名的模式“name”都将设置为它。

    把知识贡献给宇宙

    推荐文章