0

私は特に数値のみをターゲットにしているため、フロントエンドでユーザー入力を (000)000-000 にフィルター処理する JavaScript を使用して電話マスクを使用している場合、基本的に [2-9] と [0-9] をマスクとして ( jquery.maskedinput -1.3.js ) とモバイル フィルター...

jQuery(function ($e) {
var isMobile = navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry)/);
$e('#refer').val(window.location.href);

if (!(isMobile)) {      
    $e('#phone').mask('(299)299-9999');
    $e('#field_phone_number').mask('299-299-9999');
}
}); 

サーバー側の場合、PHPに正規表現があります(まだ特別なものはありません)

function phonenumber($value)
{
    return preg_match("/\(?\b[(. ]?[0-9]{3}\)?[). ]?[0-9]{3}[-. ]?[0-9]{4}\b/i", $value);
} 

文字ごとに非常に長い正規表現を作成せずに、すべての数値を対象とする正規表現または PHP スクリプトを作成するにはどうすればよいですか? 誰かが (222)222-2222 と入力した場合、戻り値が false になるかどうかを知りたいだけです。

4

2 に答える 2

2
function phonenumber($value)
{
    $prefix = '\d{3}'; // You might want to specify '2\d\d' (200 to 299)
    $regex = '#^(\('.$prefix.'\)|'.$prefix.')[\s\.-]?\d{3}[\.-]?\d{4}$#';
    if (preg_match($regex, $value))
    {
        // Number is in a suitable format

        // Now extract digits -- remove this section to not test repeated pattern
        $digits = preg_replace('#[^\d]+#', '', $value);

        // All numbers equal are rejected
        if (preg_match('#^(\d)\1{9}$#', $digits))
            return false;
        // end of pattern check

        // Otherwise it is accepted
        return true;
    }
    return false; // Not in a recognized format
}

これは、(299)423-1234と277-111-2222、および(400)1234567または4001234567を受け入れます。(400-1234567と400-12-34-56-7を拒否します。(222)も拒否します。 2が繰り返されるため、222-2222。

于 2012-11-02T23:03:24.797 に答える
1

後方参照を使用して、\1繰り返しパターンを検出できます。あなたの場合、単に a を混ぜて、と.*のような中間フィラーを無視することができます(-

  /(\d)(.*\1){7}/

フィラーとして使用される他の文字を無視して、数字を探し、同じ数字を少なくとも 7 回繰り返します。ただし、これはそれらが連続していることを保証するものではないため、(222)222-8222一致もします。

于 2012-11-02T22:51:19.107 に答える