Примечание: Ответ применим только к более старым версиям PHP, когда я писал его, я не знал о доступных последовательностях и модификаторах: \R
, (*BSR_ANYCRLF)
и (*BSR_UNICODE)
.См. Также ответ на вопрос: Как наиболее разумно заменить различные стили новой строки в PHP?
В PHP невозможно указать символ новой строки-последовательность (и) для шаблонов регулярных выражений PCRE.Модификатор m
ищет только \n
, , что задокументировано .И нет доступных настроек времени выполнения для внесения изменений, которые были бы возможны в perl, но это не вариант с PHP.
Обычно я просто изменяю строку перед использованием ее с preg_match
и т.п.:
$subject = str_replace("\r\n", "\n", $subject);
Возможно, это не совсем то, что вы ищете, но, вероятно, это поможет.
Редактировать: Что касается примера Windows EOL, который вы добавили в свой вопрос:
$EOL = "\r\n"; // Windows CR+LF
$SOURCE_TEXT = "one{$EOL}two{$EOL}three{$EOL}four";
if (preg_match('/^two$/m',$SOURCE_TEXT)) {
echo 'Found match.';
} else {
echo 'Did not find match!'; // <<< RESULT
}
Это невозможно, потому что в тексте есть \r
после two
.Так что two
не в конце строки, есть дополнительный символ, \r
перед концом строки ($
).
В руководстве по PHP четко объясняется, что только \n
считается символом, указывающим окончание строки.$
учитывает только \n
, поэтому, если вы ищете two\r
в конце строки, вам нужно изменить ваш шаблон.Это другой вариант (вместо преобразования текста, как предложено выше).