如何将尾随换行符与正则表达式匹配?
问题描述:
我试图验证字符串,以便尾随空白/换行(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”)的正确表达式是什么?
答
的问题$
是,它在字符串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]+)*$/'
为什么不只是修剪? – 2013-05-14 10:31:54
的想法是**验证**输入,而不是过滤它。 – 2013-05-15 13:30:45