如果0-9的所有数值都与字符串中的其他字符匹配,如何返回false?

时间:2012-11-02 22:45:06

标签: php javascript html regex validation

我专门针对数字,所以如果我使用前端使用javascript的手机屏幕过滤用户输入到(000)000-000,基本上[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,他们在返回时得到错误。

2 个答案:

答案 0 :(得分: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)222-2222因为重复2次。

答案 1 :(得分:1)

您可以使用反向引用\1来检测重复出现的模式。在您的情况下,您可以简单地混合使用.*来忽略(-

之类的中间填充
  /(\d)(.*\1){7}/

将查找一个数字,并且至少重复7次,忽略用作填充符的任何其他字符。但这并不能确保它们是连续的,因此(222)222-8222也会匹配。