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

PHP正则表达式:如何在不使用[\r\n]的情况下匹配\r和\n?,php,regex,newline,pcre,Php,Regex,Newline,Pcre,我已经测试了\v(垂直空白)是否匹配\r\n及其组合,但我发现\v与\r和\n不匹配。下面是我正在使用的代码 $string = " Test "; if (preg_match("#\v+#", $string )) { echo "Matched"; } else { echo "Not Matched"; } 更清楚地说,我的问题是,是否有其他方法可以匹配\r\n?要匹配给定字符串的每一行,只需使用^$锚定并建议您的正则表达式引擎在多行模式下运行。然后,^$将匹配每行的开始和结

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

$string = "
Test
";

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

更清楚地说,我的问题是,是否有其他方法可以匹配
\r\n

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

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

顺便说一句:对于行拆分,您还可以使用
split()
PHP\u EOL
常量:

$lines = explode(PHP_EOL, $string);

问题是您需要多行选项,如果使用点,则需要dotall选项。它位于分隔符的末尾


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

if (preg_match('/\v+' . PHP_EOL ."/", $text, $matches ))
   print_R($matches );

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

preg_match('#[\xD\xA]+#', $string)
这是一种模式,相当于PCRE和换行符 有多余的换行符相关的逃逸序列和替代品

嗯,这里可以使用的一个漂亮的转义序列是
\R
。默认情况下,
\R
将匹配Unicode换行符序列,但可以使用不同的选项进行配置

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

preg_match('~\R~', $string);
这相当于以下组:

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

匹配任何Unicode换行符序列;包括
ASCII
范围之外的换行字符以及行分隔符(
U+2028
)和段落分隔符(
U+2029
),您希望启用
U
(unicode)标志

u
(unicode)修饰符打开PCRE的附加功能,模式字符串被视为(UTF-8

该组等效于以下组:

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

可以限制
\R
仅与
CR
LF
CRLF
匹配:

preg_match('~(*BSR_ANYCRLF)\R~', $string);
该组等效于以下组:

(?>\r\n|\n|\r|\f|\x0b|\x85)
(?>\r\n|\n|\r|\f|\x0b|\x85|\x{2028}|\x{2029})
(?>\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”。

这并不能回答备选方案的问题,因为它工作得非常好

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

您只需将
“#\v+#”
更改为

  • “#\\v+#”
    退出反斜杠

  • “#\v+#”
    使用单引号
在这两种情况下,您将获得
\r
\n
任意组合的匹配

更新:

为了使
\v
的范围与
\R
相比更加清晰,请参见

  • \R
    \R
    匹配通用换行符;也就是说,任何被Unicode认为是换行符序列的东西。这包括由
    \v
    (垂直空白)匹配的所有字符

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

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

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

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

我想你可以用
\s+
吧。你不想使用
\r\n
的原因是什么?@Jerry:\s匹配任何空格是的,我知道,但你要求另一个匹配
\r\n
,而
\r\n
确实匹配。@Jerry:好的,但不仅仅是macthes\r\n,我猜\v会这样做,但它不会t@Jerry看我下面的答案,您可以使用PCRE中使用的
\R
而不是
\s
。小心贪婪的匹配!您可能会得到太多。这不符合\r\n多行模式无关。许多正则表达式用户得出这样的结论:只要目标字符串包含行分隔符,就必须指定多行模式。它所做的只是调整锚点(
^
$
)的行为,以便它们在线边界(即线分隔符之前和之后)匹配。OP的正则表达式不包含任何锚。哇!我从来没有用过它,这就是我要找的:)看这个例子:这个答案被添加到了,在“转义序列”下,+1代表
\R
。仅出于学术目的,如果您不处于
u
模式,您可以发明另一种匹配
\r
\n
的方法,而不使用它们:
(?![\t\cK\f])\s
为什么?因为
\s
匹配
[\t\cK\f\r\n]
,所以这是类减法的一种形式:小心。我在使用俄语单词的捕获组“~\R~”时遇到问题。当该正则表达式应用于单词“ббббббб”时,它变为“ббб”� @PedroSousa为什么省略了
u
pattern修饰符?当您想要读取输入字符串中的多字节字符时,需要告诉正则表达式引擎。