В вашем регулярном выражении есть простая ошибка: ?
является специальным символом, но вы хотите сопоставить его буквально, поэтому перед ним требуется обратная косая черта. Обратите внимание, что строковый литерал и кавычки регулярного выражения являются ортогональными, поэтому обратный слеш регулярного выражения должен быть удвоен в строковом литерале.
Кроме того, регулярные выражения являются жадными, поэтому часть .*
может соответствовать больше, чем вы предполагали, если у вас есть еще один случай ?>(
позже в строке. Если вы замените .
на [\n>]
, это предотвратит расширение матча за пределы первого >
. Если вы используете Emacs ≥23, вы можете вместо этого использовать не жадный оператор, чтобы остановить матч как можно раньше: .*?
.
"\\(<\\?php [^\n>]* \\?>\\)("
Это покажет такие вещи, как <?php foo bar?>(
как Ƥ(
.
круглые скобки с обратной косой чертой \(
… \)
в регулярном выражении разделяют группу; (match-beginning 1)
и (match-end 1)
возвращают граничные позиции для первой (и единственной) группы.
Документация по регулярным выражениям содержится в руководстве по Emacs .
Если вы хотите, чтобы совпадение распространялось на несколько строк, вам нужно [^>]*
или \\(.\\|\n\\)*?
в регулярном выражении. Кроме того, вы должны указать библиотеке Font Lock расширять свои поиски на несколько строк (по умолчанию она ограничивает все поиски в конце строки по соображениям эффективности). Используйте это:
(eval-after-load 'php-mode
'(progn
(setq font-lock-multiline t)
(font-lock-add-keywords …)))