Порядок соответствия в PCRE
Вопрос
Как я могу установить порядок сопоставления элементов в регулярном выражении PCRE?
У меня есть динамическое регулярное выражение, которое может предоставить пользователь, и которое используется для извлечения двух значений из строки и сохранения их в двух строках.Однако бывают случаи, когда два значения могут находиться в строке в обратном порядке, поэтому первое (\w+) или что-то еще необходимо сохранить во второй строке.
Решение
вы можете извлечь строки по имени, используя
(?<name>\w+)
и получить значения с помощью
pcre_get_named_substring
Другие советы
Если вы сопоставляете обе части с одним и тем же подшаблоном (например, \w+
), не повезло тебе.Но если подшаблоны заметно отличаются, у вас есть несколько вариантов, и ни один из них не очень красив.Вот регулярное выражение, которое использует условную конструкцию, соответствующую src
и type
атрибуты элемента HTML-скрипта в любом порядке:
\b(?(?=src=)
src="([^"]*)"\s+type="([^"]*)"|
type="([^"]*)"\s+src="([^"]*)"
)
(ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ:Это регулярное выражение делает множество нереалистичных предположений, главным из которых является то, что оба атрибута будут присутствовать и что они будут соседствовать друг с другом.Я использую его только для иллюстрации техники.)
Если src
атрибут появляется первым, src
и type
значения будут зафиксированы в первой и второй группах соответственно.В противном случае они появятся в четвертой и третьей группах соответственно.Именованные группы облегчили бы отслеживание событий, особенно если бы можно было использовать одно и то же имя в разных местах, как в регулярных выражениях .NET.К сожалению, PCRE требует, чтобы каждая именованная группа имела уникальное имя, а это очень плохо;это очень хорошая особенность.