18

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

$string = "
Test
";

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

更清楚地说,我的问题是,还有其他选择\r\n吗?

4

7 回答 7

43

PCRE 和换行符

PCRE具有过多的换行相关转义序列和替代方案。

好吧,你可以在这里使用的一个漂亮的转义序列是\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);

( unicode ) 修饰符打开 PCRE 的附加功能,并且 Pattern 字符串被视为 ( uUTF -8 )。

相当于以下组:

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

可以限制\R为 match 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”。

于 2013-09-24T21:50:28.243 回答
7

这并不能回答替代品的问题,因为\v效果很好

\v匹配任何被认为是垂直空格的字符;这包括平台的回车和换行字符(换行符)以及其他几个字符,所有这些都列在下表中。

您只需要更改"#\v+#"

  • "#\\v+#"转义反斜杠

或者

  • '#\v+#'使用单引号

\r在这两种情况下,您都会得到和的任意组合的匹配项\n

更新:

只是为了\v明确与\Rperlrebackslash相比的范围

  • \R
    \R匹配通用换行符;也就是说,任何被 Unicode 视为换行序列的东西。这包括由(垂直空格)匹配的所有字符\v,...
于 2014-05-15T05:03:03.477 回答
6

如果有一些奇怪的要求阻止您[\r\n]在模式中使用文字,您始终可以使用十六进制转义序列:

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

这是模式等价于[\r\n]+

于 2013-09-24T17:58:55.943 回答
1

要匹配给定字符串的每一行,只需使用^$锚点并建议您的正则表达式引擎以多行模式运行。然后^$将匹配每一行的开始和结束,而不是整个字符串的开始和结束。

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

在 PHP 中,这将是m模式之后的修饰符。/^(.*?)$/m将简单匹配每一行,由给定字符串内的任何垂直空间分隔。

顺便说一句:对于分行,您还可以使用split()PHP_EOL常量:

$lines = explode(PHP_EOL, $string);
于 2013-09-24T17:55:25.003 回答
0

问题是您需要 multiline 选项,如果使用 dot,则需要 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";
于 2013-09-24T17:55:40.067 回答
0

要匹配 PHP 中的换行符,请使用 php 常量PHP_EOL。这是跨平台的。

if (preg_match('/\v+' . PHP_EOL ."/", $text, $matches ))
   print_R($matches );
于 2013-09-24T17:57:00.263 回答
0

此正则表达式还匹配换行符\n和回车\r 符。

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

演示

要匹配一个或多个换行符或回车符,您可以使用下面的正则表达式。

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

演示

于 2014-10-20T02:48:01.143 回答