13

さて、私は今一日中正規表現について読んでいますが、それでも正しく理解していません。私がやろうとしているのは名前を検証することですが、インターネット上でこれを見つけることができる関数は、[a-zA-Z]受け入れる必要のある文字を除外して、使用するだけです。

基本的に、名前が2つ以上の単語であり、数字や特殊文字が含まれていないことを確認する正規表現が必要ですが!"#¤%&/()=...、単語にはæ、é、Âなどの文字を含めることができます...

受け入れられる名前の例は、「JohnElkjærd」または「AndréSvenson」です。
受け入れられない名前は、「Hans」、「H 4 nn 3 Andersen」、または「MartinHenriksen 」です。

重要な場合は、javascript関数のクライアント側を使用し、phpの唯一の「ネガティブ」サーバー側.match()を使用したいと思います。preg_replace()(一致しない文字を削除します)。

どんな助けでも大歓迎です。

更新:わかりました。AlixAxelの回答の
おかげで、重要な部分がサーバー側にあります。

しかし、LightWingの回答のページが示唆しているように、JavaScriptのUnicodeサポートについては何も見つからないため、クライアント側の解決策の半分になり、次のように少なくとも2つの単語と5つ以上の文字をチェックするだけです。

if(name.match(/\S+/g).length >= minWords && name.length >= 5) {
  //valid
}

別の方法は、 shiftyの回答で提案されているように、すべてのUnicode文字を指定することです。これは、上記の解決策とともに、次のようなことになる可能性がありますが、少し実用的ではありません。

4

7 に答える 7

34

次の正規表現を試してください。

^(?:[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s?)+$

PHP では、これは次のように変換されます。

if (preg_match('~^(?:[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s?)+$~u', $name) > 0)
{
    // valid
}

次のように読む必要があります。

^   # start of subject
    (?:     # match this:
        [           # match a:
            \p{L}       # Unicode letter, or
            \p{Mn}      # Unicode accents, or
            \p{Pd}      # Unicode hyphens, or
            \'          # single quote, or
            \x{2019}    # single quote (alternative)
        ]+              # one or more times
        \s          # any kind of space
        [               #match a:
            \p{L}       # Unicode letter, or
            \p{Mn}      # Unicode accents, or
            \p{Pd}      # Unicode hyphens, or
            \'          # single quote, or
            \x{2019}    # single quote (alternative)
        ]+              # one or more times
        \s?         # any kind of space (0 or more times)
    )+      # one or more times
$   # end of subject

正直なところ、これを Javascript に移植する方法がわかりません。Javascript が Unicode プロパティをサポートするかどうかさえわかりませんが、PHP PCRE では、@ IDEOne.com で問題なく動作するようです

$names = array
(
    'Alix',
    'André Svenson',
    'H4nn3 Andersen',
    'Hans',
    'John Elkjærd',
    'Kristoffer la Cour',
    'Marco d\'Almeida',
    'Martin Henriksen!',
);

foreach ($names as $name)
{
    echo sprintf('%s is %s' . "\n", $name, (preg_match('~^(?:[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s?)+$~u', $name) > 0) ? 'valid' : 'invalid');
}

申し訳ありませんが、Javascript の部分に関してはお手伝いできませんが、おそらく誰かがここにいるでしょう。


検証します:

  • ジョン・エルケアード
  • アンドレ・スベンソン
  • マルコ・ダルメイダ
  • クリストファー・ラ・クール

無効化:

  • ハンス
  • H4nn3 アンデルセン
  • マルティン・ヘンリクセン!

無効な文字を置き換えるには、これが必要な理由はわかりませんが、少し変更する必要があります。

$name = preg_replace('~[^\p{L}\p{Mn}\p{Pd}\'\x{2019}\s]~u', '$1', $name);

例:

  • H4nn3 アンデルセン-> Hnn アンデルセン
  • マルティン・ヘンリクセン!->マーティン・ヘンリクセン

常にu修飾子を使用する必要があることに注意してください。

于 2011-05-11T11:26:00.463 に答える
5

JavaScript に関しては、JavaScript 正規表現構文が Unicode 文字プロパティをサポートしていないため、より注意が必要です。実用的な解決策は、次のような文字を一致させることです。

[a-zA-Z\xC0-\uFFFF]

これにより、すべての言語の文字が許可され、キーボードで一般的に見られる数字とすべての特殊 (非文字) 文字が除外されます。絵文字や雪だるまなど、文字以外の Unicode 特殊記号も使用できるため、不完全です。ただし、これらの記号は通常、キーボードでは使用できないため、誤って入力されることはないと思います。したがって、要件によっては、許容できるソリューションになる場合があります。

于 2013-04-15T08:27:51.837 に答える
2

許可された特殊文字を正規表現に追加できます。

例:

[a-zA-ZßöäüÖÄÜæé]+

編集:

最善の解決策ではありませんが、少なくとも単語があれば結果が得られます。

[a-zA-ZßöäüÖÄÜæé]+\s[a-zA-ZßöäüÖÄÜæé]+
于 2011-05-11T11:25:05.830 に答える
2

このページにアクセスしてください正規表現の Unicode 文字

于 2011-05-11T11:17:41.690 に答える
2

上記の@Alixによる素晴らしい回答に対する最適化は次のとおりです。文字クラスを 2 回定義する必要がなくなり、任意の数の必要な単語を簡単に定義できます。

^(?:[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+(?:$|\s+)){2,}$

次のように分類できます。

^         # start
  (?:       # non-capturing group
    [         # match a:
      \p{L}     # Unicode letter, or
      \p{Mn}    # Unicode accents, or
      \p{Pd}    # Unicode hyphens, or
      \'        # single quote, or
      \x{2019}  # single quote (alternative)
    ]+        # one or more times
    (?:       # non-capturing group
      $         # either end-of-string
    |         # or
      \s+       # one or more spaces
    )         # end of group
  ){2,}     # two or more times
$         # end-of-string

基本的に、文字クラスで定義された単語を検索してから、1 つ以上のスペースまたは行末を検索することを意味します。最後の{2,}は、一致が成功するには最低 2 つの単語が見つかる必要があることを示しています。これにより、OP の「Hans」の例が一致しなくなります。


​​ の同様の解決策を探しているときにこの質問を見つけたので、Ruby 1.9 以降で使用できる正規表現を次に示します。

\A(?:[\p{L}\p{Mn}\p{Pd}\'\U+2019]+(?:\Z|\s+)){2,}\Z

主な変更点は、(行ではなく) 文字列の先頭と末尾に \A と \Z を使用することと、Ruby の Unicode 文字表記を使用することです。

于 2013-06-04T22:29:39.627 に答える
0

入力文字列をチェックするときに、次のことができます

  • 先頭/末尾の空白を削除するには、trim() を使用します
  • [^\w\s] と照合して、単語以外\空白以外の文字を検出します
  • \s+ と照合して、単語数 + 1 に等しい単語セパレータの数を取得します。

ただし、\w の短縮形にアクセント記号付きの文字が含まれているかどうかはわかりませんが、「単語文字」のカテゴリに分類されるはずです。

于 2011-05-11T11:26:10.213 に答える