Получил «два именованных подшаблона с одинаковыми именами» при объединении двух регулярных выражений в одно - PullRequest
4 голосов
/ 14 сентября 2009

Я пытаюсь объединить 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>)%'

Но мне не нравится этот способ, потому что я использую 2 имени. Мне интересно, есть ли лучший способ решить эту проблему. Заранее спасибо.

С наилучшими пожеланиями, Коробка (boxoft ... Simple & Great)

Ответы [ 2 ]

28 голосов
/ 23 августа 2011

Я нашел эту страницу в поисках способа иметь два (или более?) Именованных подшаблона с одинаковым именем, и я нашел эту страницу с ответом (соответствующая выдержка здесь)

Дубликаты имен

Если вы используете именованные шаблоны, теперь вы можете иметь одно и то же имя несколько раз, при условии, что вы добавили опцию "(? J)" в свой шаблон. Например:

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

Это будет соответствовать "Nick" или "Fred", и в зависимости от того, какой из них будет совпадать, ему будет задан именованный шаблон "name".

просто вкладывая знания обратно во вселенную

0 голосов
/ 14 сентября 2009

Вы можете комбинировать их следующим образом:

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

Это не совсем то, что было раньше, но может быть достаточно хорошим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...