一尘不染

PHP正则表达式:如何在不使用[\ r \ n]的情况下匹配\ r和\ n?

php

我已经测试了\v(垂直空白)匹配\r\n及其组合,但是发现\v\r和不匹配\n。以下是我正在使用的代码。

$string = "
Test
";

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

更明确地说,我的问题是,还有其他匹配的替代方法\r\n吗?


阅读 385

收藏
2020-05-29

共1个答案

一尘不染

PCRE和换行符

PCRE具有许多与换行相关的转义序列和替代方法。

好吧,您可以在此处使用一个漂亮的转义序列\R。默认情况下\R将匹配Unicode换行符序列,但可以使用其他替代方法进行配置。

匹配ASCII范围内的任何Unicode换行符序列。

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

这等效于以下组:

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

匹配任何Unicode换行符序列;包括ASCII范围之外的换行符以及行分隔符(U+2028)和段落分隔符(U+2029),您都想打开u
unicode )标志。

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

uunicode的 上PCRE与模式串的附加功能)改性剂匝被视为( UTF-8 )。

等效于以下组:

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

它可以限制\R匹配CRLFCRLF只:

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在字符类内部没有特殊含义。与其他无法识别的转义序列一样,默认情况下将其视为文字字符“ R”。

2020-05-29