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
Чтобы сопоставить один или несколько символов перевода строки или возврата каретки, вы можете использовать приведенное ниже регулярное выражение.
(?:(?![ \t\f])\s)+
Проблема в том, что вам нужен многострочный параметр или параметр 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";