正規表現の助けが必要です。私はこれがひどいです。
ルール:
- a から z までの文字とスペースのみ
- 最低2文字
- 最大 30 文字
- 各単語は 2 文字以上である必要があります
- 各単語の最初の文字のみを大文字にすることができますが、最初の文字は常に大文字にする必要があります
私の試み:
^[A-Z][a-z]{2,30}$
これをPHPで使用しています。
では、まず要件 1 ~ 3 を解決してみましょう。2 ~ 30文字を意味する場合は、次のように簡単です。
^[a-zA-Z ]{2,30}$
次に、その他の要件について説明します。それらを一人で処理しましょう。ポイント 4 では、各単語が の形式である必要があります[a-zA-Z][a-z]*
。各単語が少なくとも 2 文字であることを確認するには、単純に*
を a +
(1 回以上の繰り返し) に変換します。これらの前後に明示的なスペースを挿入すると[a-z]+
、大文字が直接続くことができないことが保証されます。
^[A-Z][a-z]+(?:[ ]+[a-zA-Z][a-z]+)*$
最初の単語を個別に扱ったことに注意してください。
最後に、この 2 つをどのように組み合わせますか? 1 つを先読みに入れることによって。ここで数えます:
^(?=[a-zA-Z ]{2,30}$)[A-Z][a-z]+(?:[ ]+[a-zA-Z][a-z]+)*$
これが機能するのは、入力が先読みに対してチェックされた後、エンジンが開始位置 (文字列の先頭) に「カーソル」をリセットし、通常どおりマッチングを続行するためです。このようにして、入力に対して 2 つのパスを実行し、独立した条件をチェックできます。
最後に、先読み要件は単に文字列の長さに変換されることに注意してください。このような場合は、これを個別にチェックする方が簡単です (ほとんどの場合、より適切です)。
$len = strlen($input)
if ($len < 2 || $len > 30)
// report error about string length
else if (!preg_match('/^[A-Z][a-z]+(?:[ ]+[a-zA-Z][a-z]+)*$/', $input))
// report error about pattern
else
// process input
これにより、違反した条件に応じて適切なエラー メッセージを表示することがはるかに簡単になります。
これを試してみましょう:
^[A-Z]((?<= )[A-Z]|[a-z ]){2,29}$
[A-Z] -- a capital letter
(
(?<= )[A-Z] -- either a capital letter preceded by a space
| -- or
[a-z ] -- a lowercase letter or a space
){2,29} -- 2 to 29 times (plus the initial capital)
後読みを機能させるには、PCRE ( ではなく) を使用する必要がありますereg_*
。
"My name Is bob"
↑ ↑ ↑
| | \-- this is a "(?<= )[A-Z]"
| \--- this is a "[a-z]"
\---- this is a "[ ]"
"naMe"
↑
\-- this is NOT a "(?<= )[A-Z]" (a character before the [A-Z] is not a space)
編集:くそー、「各単語は少なくとも2文字でなければならない」を追加しました。を使用しm.buettner
ます。