Вы не можете использовать обратную ссылку внутри класса символов, поскольку класс символов соответствует ровно одному символу, а обратная ссылка может потенциально соответствовать любому количеству символов или ни одному.
Что вы пытаетесь сделатьтребует отрицательного взгляда, а не отрицательного класса символов:
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 шагов.
В этом конкретном случае влияние на производительность настолько тривиально, что это не такдаже стоит упомянуть.Я просто говорю, что всякий раз, когда вы выбираете между классом персонажа и чередованием, которые совпадают с одними и теми же вещами, вы почти всегда должны использовать класс персонажа.Просто правило.