1

preg_matchでのみ単一のアンダースコアを許可するにはどうすればよいですか?

以下で作成した正規表現は、二重のアンダースコアを取りますが、これは私が望んでいないことです...

if(!preg_match('/^[a-z0-9\s\_]+$/', $name))
    {
        $error = true;
        echo '<error elementid="name" message="name - please use alpha-numbers and lowercaps only." />';
    }

例えば、

hello world                  ok
hello_world                  ok
hello__world                 not ok
hello_world__again__         not ok
_hello_world_again_          not ok
4

1 に答える 1

3

_内部を含めると、[]+倍数が可能になります。あなたはそれを囲む必要がありますが、[]+中にそれを含めないでください。構造全体は、その()+倍数を可能にするために囲まれていますが、常に文字、数字、またはスペースで終わります。

/^([a-z0-9\s]+_?[a-z0-9]+[a-z0-9\s]+)+$/i

それを分解する:

  • アウター()+は構造全体の倍数を可能にします
  • [a-z0-9\s]+複数の文字、数字、スペース(アンダースコアではありません)
  • _?[a-z0-9]+複数の文字/数字/スペース内のオプションの単一アンダースコア。ただし、スペースは続きません。
  • [a-z0-9\s]+末尾にさらに多くの文字、数字、スペース(アンダースコアで終了することはできません)
  • /ii大文字と小文字を区別しない(大文字と小文字を区別する必要がある場合は削除してください)

// Updated to prevent space after underscore
$patt = '/^([a-z0-9\s]+_?[a-z0-9]+[a-z0-9\s]+)+$/i';

echo preg_match($patt, 'hello world');
// 1
echo preg_match($patt, 'hello_world');
// 1
echo preg_match($patt, 'hello_world_');
// 0
echo preg_match($patt, 'hello__world');
// 0
echo preg_match($patt, 'hello_world how_are you');
// 1
echo preg_match($patt, 'hello_world how_are you_');
// 0
echo preg_match($patt, 'hello_world__ how_are you_');
// 0 
echo preg_match($patt, 'hello_world how_ are you');
// 0
于 2013-02-09T16:30:22.213 に答える