Я думаю, у вас больше проблем, чем просто точка, не соответствующая новой строке, но позвольте мне начать с рекомендации по форматированию. Вы можете использовать практически любой знак препинания в качестве разделителя регулярного выражения, а не только косую черту ('/'). Если вы используете другой символ, вам не нужно экранировать косые черты в регулярном выражении. Я понимаю, что '%' популярен среди PHPers; это сделало бы ваш аргумент шаблона:
'%\{a\}([.\n]+)\{/a\}%'
Теперь причина, по которой регулярное выражение не работает так, как вы предполагали, заключается в том, что точка теряет свое особое значение, когда она появляется внутри класса символов (квадратные скобки) — поэтому [.\n]
просто соответствует точке или переводу строки. То, что вы искали, было (?:.|\n)
, но я бы рекомендовал сопоставить возврат каретки, а также перевод строки:
'%\{a\}((?:.|[\r\n])+)\{/a\}%'
Это потому, что слово «новая строка» может относиться к «\n» в стиле Unix, «\r\n» в стиле Windows или «\r» в стиле старых Mac. Любая данная веб-страница может содержать любой из этих стилей или смесь двух или более стилей; сочетание "\n" и "\r\n" очень распространено. Но с режимом /s (также известным как однострочный или DOTALL-режим) вам не нужно об этом беспокоиться:
'%\{a\}(.+)\{/a\}%s'
Однако есть еще одна проблема с исходным регулярным выражением, которая все еще присутствует в этом: +
жадный. Это означает, что если в тексте есть более одной последовательности {a}...{/a}
, при первом применении вашего регулярного выражения оно будет соответствовать всем им, от первого {a}
до последнего {/a}
. Самый простой способ исправить это — сделать +
нежадным (также известным как «ленивый» или «неохотный»), добавив вопросительный знак:
'%\{a\}(.+?)\{/a\}%s'
Наконец, я не знаю, что делать с «$» перед открывающей кавычкой вашего аргумента шаблона. Я не занимаюсь PHP, но мне это кажется синтаксической ошибкой. Если кто-то может просветить меня в этом вопросе, я был бы признателен.
person
Alan Moore
schedule
30.03.2009