PHP Regex: как совместить \ r и \ n, не используя ?

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

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

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

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

PCRE обладает избытком связанных с новой строкой управляющих последовательностей и альтернатив.

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

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

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

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

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

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

 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 соответствует любому символу, который считается вертикальным пробелом; это включает в себя символы возврата каретки платформы и строки (newline) плюс несколько других символов, перечисленных в таблице ниже.

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

  • "#\\v+#" удаляет обратную косую черту

или

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

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

Обновить:

Просто для того, чтобы сделать область видимости \v прозрачной по сравнению с \R , из perlrebackslash


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

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

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

Это шаблон эквивалентен [\r\n]+ .

Чтобы сопоставить каждую LINE данной строки, просто используйте привязки ^$ Anchors и советьте свой механизм регулярных выражений работать в многострочном режиме. Тогда ^$ будет соответствовать началу и концу каждой строки, а не целым целым начало и конец.

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

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

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

 $lines = explode(PHP_EOL, $string); 

Проблема заключается в том, что вам нужно использовать многострочный вариант или опцию 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"; 

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

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

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

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

DEMO

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

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

DEMO