1

ユーザー名を分析するコードを書いているだけです。これまでのところ、ユーザー名に不適切な単語、句読点、記号、数字、または繰り返し文字が含まれているかどうかを検出するコードを作成しましたが、異常な大文字の検出に苦労しました。

これまでのところ、非常に簡単な方法を導入するか、次の形式でこれを実行しています。名前に大文字が 3 文字以上含まれている場合、その名前は拒否されます。(Anne-marie のように二重の名前を持っている人もいるため、2 つ使用しました)。

$capitals = strlen($name) - strlen(preg_replace('/[A-Z]/', '', $name));
    if ($capitals > 2) {
        $hasError = true; 
}

ただし、通常とは異なる大文字化の問題に対する中途半端な解決策が得られます。問題は、中途半端!名前に大文字と小文字の多くの可能なパターンを許可しますが、それらが 2 文字を超える場合は許可されません。

そのため、if ステートメントに追加のコードを追加して、大文字の繰り返しをチェックし、上記のコードを次のようにしました。

$capitals = strlen($name) - strlen(preg_replace('/[A-Z]/', '', $name));
    if (preg_match('/[A-Z]{2,}/', $name) || $capitals > 2) {
        $hasError = true; 
}

これで、この問題の 70% が解決したようです。ユーザーはこのようなパターンを使用できなくなりました。XXxxx、XxXxX、xxxXX、xxx-XXXxx。しかし、使用する文字が 2 文字未満であり、大文字をグループ化しない限り、対処しなければならない問題がまだあります。「クールな」見た目の名前を作成できます。そのため、ユーザーが JeSse のようなスタイルの名前を入力した場合、それは受け入れられます。

だから私の質問は、この問題の最後のステップについてどうすればよいですか? ユーザーが Jesse、Jesse-James、Jesse James の形式でファースト ネームを持つことだけを許可する必要があります。名前が二重のバレルであっても、名前の最初の文字だけが大文字になっていることを確認するにはどうすればよいですか?

Python では、.find() を使用して、最初の単語の最初の文字を検出し、それが大文字であることを確認し、スペースまたはハイフンに遭遇するまでカウントしてから、スペースまたはハイフンの後の次の文字を確認しますも大文字ですか?しかし、PHPで正規表現を使用してこれを行う方法がわかりません。

これは正規表現でそれを行う正しい方法でしょうか? もしそうなら、どうすればいいですか?または、PHP には、Python と同様の方法で使用できる秘密の .find() 関数がありますか? もしそうなら、そのルートをたどる方が適切でしょうか?

「正規表現の問題があります。パターンを検出する必要があります」などの質問をしている多くの numptys のようです。その後、彼らにとって役立つ回答が返ってくることを期待しています。十分な情報を提供したかったのです。将来このページにたどり着く人々に役立つように。

今後ともよろしくお願いいたします。

ジェイミー

PS興味深いことに、PHPで英語以外の文字を使用する方法を知っている人はいますか。検出したい文字の文字列を作成する必要がありますか、それとも php には html エンティティのような各文字の「コード」がありますか?

4

1 に答える 1

1

おそらく、すべてを 1 つの正規表現で行うことができます。

 /^ [A-Z][a-z]+ ( [-\s.] [A-Z][a-z]+ )? $/x

JesseまたはJesse-JamesまたはJesse.JamesまたはJesse Jamesのみを許可します。(ドットと\sペースが不要な場合は削除してください。)

2 番目の部分が小文字で始まることを許可する場合、または少なくとも 2 つの小文字が互いに続くことを確認する場合{2,}は、代わりに を使用し+ます。

 /^ [A-Z][a-z]{2,} ( [-\s.] [A-Z]? [a-z]{2,} )? $/x
                              ^
                          optional now

Unicodenessの場合\p{Lu}は大文字に使用します
小文字\p{Ll}の場合:

 /^ \p{Lu}\p{Ll}+ ( [-\s.] \p{Lu} ? \p{Ll}+ )? $/xu

Jesse-J.-Jamesたとえば、許可するために別のオプションを追加したい場合があります。したがって、次のような単一文字の略語を使用できます。

 ([A-Z] [.] [-\s])?

ただし、最初と中間の部分で繰り返す必要があるかもしれません。

于 2013-01-24T01:41:01.913 に答える