Допустим, у меня есть строка:
12345678
У меня также есть следующие шаблоны:
/^.*$/
/^[0-9]+$/
Оба этих шаблона соответствуют строке. Я хочу выяснить, что оба шаблона соответствуют строке. Я могу пройтись по каждой схеме и добавить preg_match
но это слишком медленно
Я хочу быть в состоянии сделать что-то вроде этого:
preg_match_all('/^(?P<pattern1>.*)|(?P<pattern2>[0-9]+)$/', $string, $matches);
Это, однако, даст мне что-то вроде:
[
'pattern1' => '12345678',
'pattern2' => ''
]
Как вы можете видеть, pattern2 появляется пустым, потому что pattern 1 уже захватил строку.
Как бы я написал свой preg_match_all
регулярное выражение, чтобы и pattern1, и pattern2 (и любые другие шаблоны) имели шанс сопоставить одну и ту же строку? Однако я не придерживаюсь правила регулярного выражения, которое будет возвращать все шаблоны, если только все шаблоны совпадают. Я хочу, чтобы он возвращал все шаблоны, которые совпадают, и все шаблоны, которые не совпадают.
редактировать
Просто чтобы уточнить,
Шаблоны, которые я привел в качестве примеров, являются лишь примерами.
В моем реальном сценарии будет неизвестное количество шаблонов, которые соответствуют неизвестным строкам.
Причина, по которой цикл через foreach слишком медленный, заключается в том, что я буду циклически проходить через десятки шаблонов с тысячами строк. Я могу ускорить эту часть кода на количество шаблонов, если их можно эффективно объединить в одно правило на строку.
Вы можете использовать следующий трюк:
^(?P<pattern1>(?P<pattern2>^[0-9]+$)|.*)$
Поскольку pattern2 находится внутри pattern1 и отделен |
.. каждый символ проверяется на совпадения ..
Увидеть DEMO
Других решений пока нет …