Предположим, что у меня есть две строки, содержащие регулярные выражения. Как я могу объединить их? В частности, я хочу, чтобы эти два выражения были альтернативными.
$a = '# /[a-z] #i';
$b = '/ Moo /x';
$c = preg_magic_coalesce('|', $a, $b);
// Desired result should be equivalent to:
// '/ \/[a-zA-Z] |Moo/'
Конечно, делать это как строковые операции нецелесообразно, потому что это потребует анализа синтаксических выражений, построения деревьев синтаксиса, объединения деревьев и последующего вывода другого регулярного выражения, эквивалентного дереву. Я полностью счастлив без этого последнего шага. К сожалению, у PHP нет класса RegExp (или нет?).
Есть ли способ достичь этого? Кстати, предлагает ли какой-либо другой язык способ? Разве это не нормальный сценарий? Думаю нет.: - (
Альтернативно, есть ли способ проверить эффективно, если одно из двух выражений совпадает, и какое из них соответствует ранее (и если они совпадают в той же позиции, что матч длиннее)? Это то, что я делаю в данный момент. К сожалению, я делаю это по длинным строкам, очень часто, для более чем двух моделей. Результат медленный (и да, это определенно узкое место).
EDIT:
Я должен был быть более конкретным - извините. $a
и $b
являются переменными, их содержимое находится вне моего контроля! В противном случае я бы просто объединил их вручную. Поэтому я не могу делать никаких предположений о используемых разделителях или модификаторах регулярных выражений. Обратите внимание, например, что мое первое выражение использует модификатор i
(игнорировать оболочку), а во втором - x
(расширенный синтаксис). Поэтому я не могу просто конкатенировать два, потому что второе выражение не игнорирует обсадную колонну, а первое не использует расширенный синтаксис (и любые пробелы в нем значительны!