PHP Regex: Как сопоставить \r и \n без использования [\r\n]?

Я проверил \v (вертикальное пустое пространство) для сопоставления \r\n и их комбинации, но я узнал, что \v не совпадает \r а также \n, Ниже мой код, который я использую..

$string = "
Test
";

if (preg_match("#\v+#", $string )) {
  echo "Matched";
} else {
  echo "Not Matched";
}

Чтобы быть более ясным, мой вопрос, есть ли другая альтернатива, чтобы соответствовать \r\n?

7 ответов

Решение

PCRE и новые строки

PCRE имеет избыток escape-последовательностей и альтернатив, связанных с новой строкой.

Ну, изящная escape-последовательность, которую вы можете использовать здесь \R, По умолчанию \R будет соответствовать последовательностям перевода строки Unicode, но его можно настроить с использованием различных альтернатив.

Чтобы соответствовать любой последовательности новой строки Unicode, которая находится в ASCII спектр.

preg_match('~\R~', $string);

Это эквивалентно следующей группе:

(?>\r\n|\n|\r|\f|\x0b|\x85)

Соответствовать любой последовательности новой строки Unicode; включая символы новой строки за пределами ASCII диапазон и оба разделителя строк (U+2028) и разделитель абзацев (U+2029), вы хотите включить u (Юникод) флаг.

preg_match('~\R~u', $string);

u Модификатор (Unicode) включает дополнительную функциональность PCRE, а строки Pattern обрабатываются как (UTF-8).

Это эквивалентно следующей группе:

(?>\r\n|\n|\r|\f|\x0b|\x85|\x{2028}|\x{2029})

Можно ограничить \R соответствовать CR, LF, или же CRLF только:

preg_match('~(*BSR_ANYCRLF)\R~', $string);

Это эквивалентно следующей группе:

(?>\r\n|\n|\r)

дополнительный

Поддерживаются пять различных соглашений для обозначения разрывов строк в строках:

(*CR)        carriage return
(*LF)        linefeed
(*CRLF)      carriage return, followed by linefeed
(*ANYCRLF)   any of the three above
(*ANY)       all Unicode newline sequences

Примечание: \R не имеет особого значения внутри класса символов. Как и другие нераспознанные escape-последовательности, по умолчанию он обрабатывается как буквенный символ "R".

Это не отвечает на вопрос об альтернативах, потому что \vработает отлично

\v соответствует любому символу, который считается вертикальным пробелом;это включает символы возврата каретки и перевода строки (новая строка), а также несколько других символов, перечисленных в таблице ниже.

Вам нужно только изменить "#\v+#" либо

  • "#\\v+#" избежать обратной косой черты

или же

  • '#\v+#' использовать одинарные кавычки

В обоих случаях вы получите совпадение для любой комбинации \r а также \n,

Обновить:

Просто чтобы сделать сферу \v ясно по сравнению с \Rот perlrebackslash


  • \R соответствует общему переводу строки; то есть все, что считается Unicode последовательностью разрыва строки. Это включает в себя все символы, соответствующие\v (вертикальные пробелы), ...

Если есть какое-то странное требование, которое мешает вам использовать буквальное [\r\n] в вашем паттерне вы всегда можете использовать шестнадцатеричные escape-последовательности:

preg_match('#[\xD\xA]+#', $string)

Это образец эквивалентен [\r\n]+,

Чтобы соответствовать каждой ЛИНИИ данной Строки, просто используйте ^$ Якоря и советы вашего двигателя регулярных выражений для работы в многострочном режиме. затем ^$ будет соответствовать началу и концу каждой строки вместо целых строк начала и конца.

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

в PHP это было бы m Модификатор после шаблона. /^(.*?)$/m будет просто соответствовать каждой строке, разделенной любым вертикальным пространством внутри данной строки.

Кстати: для разделения строк, вы также можете использовать split() и PHP_EOL постоянная:

$lines = explode(PHP_EOL, $string);

Чтобы соответствовать новой строке в PHP, используйте константу php PHP_EOL, Это кроссплатформенность.

if (preg_match('/\v+' . PHP_EOL ."/", $text, $matches ))
   print_R($matches );

Это регулярное выражение также соответствует переводу строки \n и возврат каретки \r персонажи.

(?![ \t\f])\s

DEMO

Чтобы сопоставить один или несколько символов перевода строки или возврата каретки, вы можете использовать приведенное ниже регулярное выражение.

(?:(?![ \t\f])\s)+

DEMO

Проблема в том, что вам нужен многострочный параметр или параметр dotall, если используется точка. Это идет в конце разделителя.

http://www.php.net/manual/en/regexp.reference.internal-options.php

$string = "
Test
";
if(preg_match("#\v+#m", $string ))
echo "Matched";
else
echo "Not Matched";
Другие вопросы по тегам