Модификаторы m и s
Пока мы не обращали внимание на то, что наши регулярки могут обрабатывать не только однострочные строки, но и многострочные (те, где есть enter-ы - переводы строк).
{:}##
~$str = '##
~~первая подстрока##
~~вторая подстрока##
~';##
{/}
Регулярки имеют два режима поиска и замены: многострочный и однострочный.
Многострочный режим явно задается
с помощью модификатора m, а однострочный
- с помощью модификатора s.
Давайте посмотрим разницу между этими режимами:
Многострочный:
Шляпка ^ соответствует началу каждой подстроки, а $ - концу:
{:}##
~$str = '##
~~^первая подстрока$##
~~^вторая подстрока$##
~';##
{/}
Вместо ^ для начала всей строки следует использовать \A, а вместо $ для конца всей строки - \z.
Точка совпадает с любым символом, за исключением перевода строки (точнее она не совпадает со \n, а со \r совпадает!).
Однострочный:
Шляпка ^ соответствует началу всей строки, а $ - концу:
{:}##
~$str = '^##
~~первая подстрока##
~~вторая подстрока##
~$';##
{/}
Точка совпадает с любым символом.
Внимание!!! По умолчанию функции поиска
preg_match и preg_match_all
работают в многострочном режиме (будто добавлен
модификатор m), а поиска и замены
preg_replace - в однострочном (будто
добавлен модификатор s)!
Исправляйте добавлением соответствующего модификатора (при необходимости).