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)前に空白文字がない場合に true となる、負の後読みアサーションです。\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]+)*$/'

この正規表現は、区切り文字が任意の種類の空白である可能性があり、それらが複数存在する可能性があることを前提としています。1 つの空白文字 ( \x20) のみを許可する場合は、次のようにします。

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