5

我正在尝试验证字符串,以便不允许尾随空格/换行符(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”?

4

3 回答 3

2

问题$在于,它匹配在字符串的末尾 或紧接在作为字符串中最后一个字符的换行符之前(默认情况下),因此您不能使用锚点匹配\n字符串末尾的a。$

为了避免这种情况,您可以使用\z(参见php.net 上的转义序列),它将始终在字符串的末尾匹配(也独立于multiline修饰符)。

所以一个解决方案是

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

(?<!\s)是一个否定的后向断言,如果之前没有空格字符,则为真\z

于 2013-05-14T10:42:04.163 回答
0

尝试这个

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

if(!$status) {
    echo "Allow";
}
else {
    echo "Not Allow";
}
于 2013-05-14T11:29:43.297 回答
0

这听起来像一个基本的“无尾随分隔符”问题,如此处所示但使用空格而不是连字符。

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

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

'/^[a-zA-Z0-9]+( [a-zA-Z0-9]+)*$/'
于 2013-05-14T12:03:33.340 回答