Я проверил \v
(вертикальное пустое пространство) для соответствия \r\n
и их комбинаций, но я обнаружил, что \v
не соответствует \r
и \n
. Ниже мой код, который я использую.
$string = " Test "; if (preg_match("#\v+#", $string )) { echo "Matched"; } else { echo "Not Matched"; }
Чтобы быть более ясным, мой вопрос в том, есть ли другая альтернатива для соответствия \r\n
?
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