6

次のことを行うには、PHP正規表現が必要です。

[a-zα-ωá-źа-яڡ-چა-ჰא-ת]と中国語、日本語 (より utf-8) の文字を許可したい。[^٩٨٧٦٥٤٣٢١٠۰۱۲۳۴۵۶۷۸۹] (アラビア数字)を禁止したいです。

これは私がやったことです:

function isValidFirstName($first_name) {
    return preg_match("/^(?=[a-zα-ωá-źа-яա-ֆა-ჰא-ת]+([a-zα-ωá-źа-яա-ֆა-ჰא-ת' -]+)?\z)[a-zα-ωá-źа-яա-ֆა-ჰא-ת' -]+$/i", $first_name);
}

動作しているように見えますが、複数の言語の文字を入力すると検証されません。

例: Авпа Вапапва á-ź John - 検証しません。John Gger - 検証、á-ź á-ź - 検証。

私はこれらすべてをしたいと思います。

または、ユーザーがより多くの言語の文字列を入力した場合にメッセージをエコーする方法がある場合。

4

2 に答える 2

2

正規表現を使用して次の方法をチェックすることで、アラビア文字を除外できます。

if (preg_match('/(?:[\p{Hebrew}]+)/imu', $subject)) {
    # Successful match
} else {
    # Match attempt failed
}

正規表現の説明

<!--
(?i)(?:[\p{IsHebrew}]+)

Options: case insensitive; ^ and $ match at line breaks

Match the remainder of the regex with the options: case insensitive (i) «(?i)»
Match the regular expression below «(?:[\p{IsHebrew}]+)»
   A character in the Unicode block “Hebrew” (U+0590..U+05FF) «[\p{IsHebrew}]+»
      Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
-->
于 2012-05-08T10:56:59.913 に答える
2

ここで失敗のケースを再現することはできません (Авпа Вапапва á-ź John問題なく検証されます) が、正規表現を大幅に単純化できます。その先読みアサーションは必要ありません。

preg_match('/^[a-zα-ωá-źа-яա-ֆა-ჰא-ת][a-zα-ωá-źа-яա-ֆა-ჰא-ת\' -]*$/i', $first_name)

あなたが与えた文字範囲から私が知る限り、数字を除外する必要はありません.これらの文字クラスの外にあるものはすでに正規表現を失敗させるからです.

別の考慮事項: 目標が任意の言語/スクリプトの任意の文字 (および句読点とスペース) を許可することである場合は、(Unicode 文字列を使用している場合) これをさらに単純化して次のようにできます。

preg_match('/^\pL[\pL\' -]*$/iu', $first_name)

しかし、一般的に、正規表現 (またはその他の手段) によって名前を検証しようとはしませ

于 2012-05-08T11:04:52.250 に答える