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

Php 如果0-9的所有数值都与字符串中的其他字符匹配,如何返回false?,php,javascript,html,regex,validation,Php,Javascript,Html,Regex,Validation,我专门针对数字,所以如果我在前端使用javascript的手机掩码,将用户输入过滤到(000)000-000,基本上[2-9]和[0-9]作为掩码()和移动筛选器 jQuery(function ($e) { var isMobile = navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry)/); $e('#refer').val(window.location.href); if (!(isMobile)) {

我专门针对数字,所以如果我在前端使用javascript的手机掩码,将用户输入过滤到(000)000-000,基本上[2-9]和[0-9]作为掩码()和移动筛选器

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中的正则表达式(还没有什么特别之处)


如何创建针对所有数值的正则表达式或php脚本,而不为每个字符创建很长的正则表达式?我只是想知道,如果有人输入(222)222-2222,他们在报税表上会得到一个错误

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

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

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

您可以使用反向引用
\1
来检测重复出现的模式。在您的情况下,您只需将
*
混合在一起,以忽略
-

  /(\d)(.*\1){7}/
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
}
将查找一个数字,并至少重复7次,忽略用作填充符的任何其他字符。但是,这不能确保它们是连续的,因此
(222)222-8222
也会匹配

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)。由于重复的2,它还将拒绝(222)222-2222



这将接受(299)423-1234和277-111-2222,以及(400)1234567或4001234567。它将拒绝(400-1234567和400-12-34-56-7)。它还将拒绝(222)2222-2222,因为重复的2。

您可以删除所有非数字字符,然后与
2222222
等字符串进行比较,而不是与
(222)进行比较222-2222
。对不起,我不明白。正则表达式必须识别(XXX)XXX-XXXX,其中X介于0和9之间?@clentfort我们希望按原样保存字符,此验证返回false,如果用户提交的内容不正确,用户有机会更正。因此,我不想删除,然后替换。您不必销毁输入,复制它。您可以删除所有非数字字符,然后与
2222之类的字符串进行比较
而不是比较
(222)222-2222
。对不起,我不明白。正则表达式必须识别(XXX)XXX-XXXX,其中X介于0和9之间?@clentfort我们希望按原样保存字符,此验证返回false,如果提交的字符不正确,用户有机会更正。因此,我不想删除,然后替换。您不必破坏输入,复制它。您如何将此实现到我的preg_match()中?我在测试时尝试的所有格式都无效。您如何将其应用到我的preg_match()中?我在测试时尝试的所有格式都被判无效。太棒了,这很有效!顺便说一句,我在数字提取器中将你的$phone更改为$value。谢谢。我看到你的
$value
太晚了,只更改了我自己的
$phone
的第一个实例,忘记了第二个。如果我看起来很笨,很抱歉,但我不熟悉带US(?)电话格式的ar。我猜2xx是一个蜂窝前缀?例如这里的2(2xx)如果是0或1,我们格式的2XX-XXXX将永远无效,但是其他的可以容纳0-9,所以我认为这是一种很好的消除坏号码的方法。我们可以建立一个数据库或列表来获得更具体的号码,但这太过分了。这适用于美国的所有电话号码,而不仅仅是手机号码。更新:我最后添加了
$prefix='[2-9]{1}\d{1}\d{1}“;
获取正确的200-299筛选器。“2\d\d”对我不起作用。哦,那么你可以使用
[2-9]\d\d
--
{1}
是默认值,你可以忽略它。或者
[2-9]\d{2}
,但我认为
[2-9]\d\d
更清晰。太棒了,这就像一个符咒!顺便说一句,我在数字提取器中将你的$phone更改为$value。谢谢你。我看到你的
$value
太晚了,只更改了我自己的
$phone
的第一个实例,忘记了第二个。如果我看起来很笨,很抱歉,但我对我们不熟悉(?)电话格式。我猜2xx是手机前缀?例如这里的2(2xx)如果是0或1,我们格式的2XX-XXXX将永远无效,但是其他的可以容纳0-9,所以我认为这是一种很好的消除坏号码的方法。我们可以建立一个数据库或列表来获得更具体的号码,但这太过分了。这适用于美国的所有电话号码,而不仅仅是手机号码。更新:我最后添加了
$prefix='[2-9]{1}\d{1}\d{1}“;
获得正确的200-299筛选器。“2\d\d”对我不起作用。哦,那么你可以使用
[2-9]\d\d
--
{1}
是默认值,你可以忽略它。或者
[2-9]\d{2}
,但我认为
[2-9]\d\d
更清晰。