Вы не можете использовать обратную ссылку внутри класса символов, потому что класс символов соответствует только одному символу, а обратная ссылка потенциально может соответствовать любому количеству символов или ни одному.
То, что вы пытаетесь сделать, требует отрицательного взгляда вперед, а не отрицательный класс символов:
preg_match_all('/__\(([\'"])(?:(?!\1).)+\1\)/',
"__('match this') . 'not this'", $matches);
Я также изменил ваше чередование - \'|"
- на класс символов - [\'"]
- потому что это намного эффективнее, и я экранировал внешние скобки, чтобы они соответствовали буквальным скобкам.
РЕДАКТИРОВАТЬ: Думаю, мне нужно расширить это «более эффективное» замечание. Я взял пример, который Фридл использовал для демонстрации этого момента, и протестировал его в RegexBuddy.
Применительно к целевому тексту abababdedfg
^[a-g]+$
сообщает об успехе после трех шагов, а
^(?:a|b|c|d|e|f|g)+$
требует 55 шагов.
И это при успешном совпадении. Когда я пробую это на abababdedfz
,
^[a-g]+$
сообщает об ошибке после 21 шага;
^(?:a|b|c|d|e|f|g)+$
выполняет 99 шагов.
В данном конкретном случае влияние на производительность настолько незначительно, что даже не стоит упоминать. Я просто говорю, что всякий раз, когда вы выбираете между классом персонажа и чередованием, которые соответствуют одним и тем же вещам, вы почти всегда должны выбирать класс персонажа. Просто эмпирическое правило.
person
Alan Moore
schedule
18.05.2011