如何将尾随换行符与正则表达式匹配?

问题描述:

我试图验证字符串,以便尾随空白/换行(PHP_EOL,\ n,\ r,\ t和“”)是不允许的。下面的代码:如何将尾随换行符与正则表达式匹配?

$pattern = '/^[a-zA-Z0-9 ]+?[^\s]$/'; 
$value = 'foo' . PHP_EOL; 
$status = preg_match($pattern, $value); 

尾随PHP_EOL和 “\ n” 个表达式匹配,用 “\ t”, “\ r” 和 “” 不。

禁止在字符串末尾包含所有空白/换行符(包括PHP_EOL和“\ n”)的正确表达式是什么?

+2

为什么不只是修剪? – 2013-05-14 10:31:54

+0

的想法是**验证**输入,而不是过滤它。 – 2013-05-15 13:30:45

的问题$是,它在字符串or immediately before a newline character that is the last character in the string (by default)结束比赛,因此你不能用$锚字符串的结尾匹配\n

为避免出现这种情况,您可以使用\z(请参阅php.net上的escape sequences),该字符串始终与字符串末尾匹配(也与multiline修饰符无关)。

因此,一个解决方案是

$pattern = '/^[a-zA-Z0-9 ]+?(?<!\s)\z/'; 

(?<!\s)是一个negative lookbehind assertion,这是真的,如果有以前\z

没有空格字符试试这个

$pattern = '/\s(?=\s*$)/'; 
$value = 'foo'. PHP_EOL; 
$status = preg_match($pattern, $value); 

if(!$status) { 
    echo "Allow"; 
} 
else { 
    echo "Not Allow"; 
} 

这听起来像一个基本的“没有尾随分隔符”的问题,如看到here,但用空格代替连字符。

'/^[a-zA-Z0-9]+(\s+[a-zA-Z0-9]+)*$/' 

这个正则表达式假定分隔符可以是任何类型的空格,并且可以有多个空格。如果你只想允许一个空格字符(\x20),这将做到这一点:

'/^[a-zA-Z0-9]+([a-zA-Z0-9]+)*$/'