Php 如果0-9的所有数值都与字符串中的其他字符匹配,如何返回false?
我专门针对数字,所以如果我在前端使用javascript的手机掩码,将用户输入过滤到(000)000-000,基本上[2-9]和[0-9]作为掩码()和移动筛选器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)) {
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
更清晰。