Jas*_*OOO 15 php regex pcre newline
我已经测试了\v
(垂直空白区域)匹配\r\n
和它们的组合,但我发现\v
它不匹配\r
和\n
.以下是我正在使用的代码..
$string = "
Test
";
if (preg_match("#\v+#", $string )) {
echo "Matched";
} else {
echo "Not Matched";
}
Run Code Online (Sandbox Code Playgroud)
更清楚的是,我的问题是,是否有其他替代品可供选择\r\n
?
hwn*_*wnd 37
PCRE具有多种与换行有关的转义序列和替代方案.
好吧,你可以在这里使用一个漂亮的转义序列\R
.默认情况下,\R
它将匹配Unicode换行符序列,但可以使用不同的替代方案进行配置.
匹配ASCII
范围内的任何Unicode换行序列.
preg_match('~\R~', $string);
Run Code Online (Sandbox Code Playgroud)
这相当于以下组:
(?>\r\n|\n|\r|\f|\x0b|\x85)
Run Code Online (Sandbox Code Playgroud)
匹配任何Unicode换行序列; 包括ASCII
范围之外的换行符以及行分隔符(U+2028
)和段落分隔符(U+2029
),您要打开u
(unicode)标志.
preg_match('~\R~u', $string);
Run Code Online (Sandbox Code Playgroud)
的u
(unicode的)改性剂导通的PCRE附加功能和模式字符串被视为(UTF-8 ).
相当于以下组:
(?>\r\n|\n|\r|\f|\x0b|\x85|\x{2028}|\x{2029})
Run Code Online (Sandbox Code Playgroud)
它可以限制\R
匹配CR
,LF
或CRLF
只:
preg_match('~(*BSR_ANYCRLF)\R~', $string);
Run Code Online (Sandbox Code Playgroud)
相当于以下组:
(?>\r\n|\n|\r)
Run Code Online (Sandbox Code Playgroud)
支持五种不同的约定来指示字符串中的换行符:
(*CR) carriage return
(*LF) linefeed
(*CRLF) carriage return, followed by linefeed
(*ANYCRLF) any of the three above
(*ANY) all Unicode newline sequences
Run Code Online (Sandbox Code Playgroud)
注意:\R
在字符类中没有特殊含义.与其他无法识别的转义序列一样,默认情况下它被视为文字字符"R".
这并没有回答替代品的问题,因为\v
效果非常好
\v
匹配任何被认为是垂直空格的字符; 这包括平台的回车符和换行符(换行符)以及其他几个字符,全部列在下表中.
您只需要更改"#\v+#"
为
"#\\v+#"
逃避反斜杠要么
'#\v+#'
使用单引号在这两种情况下,你会得到的任意组合的匹配\r
和\n
.
更新:
从perlrebackslash\v
开始\R
,只是为了明确范围
- \ R
\R
匹配通用换行符; 也就是说,任何被Unicode视为换行序列的东西.这包括与\v
(垂直空白)匹配的所有字符,......
如果有一些奇怪的要求阻止您[\r\n]
在模式中使用文字,则可以始终使用十六进制转义序列:
preg_match('#[\xD\xA]+#', $string)
Run Code Online (Sandbox Code Playgroud)
这是模式相当于[\r\n]+
.