2013-05-14 82 views
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」)的正確表達式是什麼?

+2

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

+0

的想法是**驗證**輸入,而不是過濾它。 – 2013-05-15 13:30:45

回答

2

的問題$是,它在字符串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

0

沒有空格字符試試這個

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

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

這聽起來像一個基本的「沒有尾隨分隔符」的問題,如看到here,但用空格代替連字符。

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

這個正則表達式假定分隔符可以是任何類型的空格,並且可以有多個空格。如果你只想允許一個空格字符(\x20),這將做到這一點:

'/^[a-zA-Z0-9]+([a-zA-Z0-9]+)*$/' 
相關問題