Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于电话号码验证的简单正则表达式更改_Php_Regex - Fatal编程技术网

Php 用于电话号码验证的简单正则表达式更改

Php 用于电话号码验证的简单正则表达式更改,php,regex,Php,Regex,我有这个功能来检查我的电话号码: function isValid( $what, $data ) { switch( $what ) { // validate a phone number case 'phone_number': $pattern = "/^[0-9-+]+$/"; break;

我有这个功能来检查我的电话号码:

function isValid( $what, $data ) {

        switch( $what ) {

                // validate a phone number
                case 'phone_number':
                        $pattern = "/^[0-9-+]+$/";

                break;



                default:
                        return false;
                break;

        }
        return preg_match($pattern, $data) ? true : false;
}
我想更改该正则表达式以接受以下内容:
字符,如(800)和
空格

例如,该数字将通过验证,但现在不通过:

+1(201)223-3213这个regexp怎么样

/^[0-9-+()\s]+$/

在动作

中,让我们逐步构造正则表达式,同时考虑在匹配前空间被修剪。

  • 开始时可能有+符号,也可能没有。这也需要转义。
    \+?
  • 然后是一个或多个数字,在带括号的部分前面
    [0-9]+
    如果数字可以直接以括号中的一个组开头,您可能需要写入
    [0-9]*
  • 然后,可选地在括号中出现一组数字:
    (\[0-9]+\)?
    。假设只允许一个这样的组
  • 然后是本地电话号码,也允许连字符:
    [0-9-]*
  • 最后一个字符必须是数字
    [0-9]
    ,此处不允许连字符

    ^\+?[0-9]+(\([0-9]+\))?[0-9-]*[0-9]$
    

查看结果。修剪空格看起来像
$trimmed=str\u replace(“”,,$pattern);

既然您似乎是在使用它进行验证,那么您可以使用
str\u replace('[\s\+\-\(\)],'',$data)
来获取一个应该包含的字符串(如果电话号码有效)只包含数字。然后,您可以通过运行
preg_match('\d{11}',$data)
{11}
表示11位数字,如果有允许的范围,请像这样使用min,max
{min,max}
,例如
\d{10,11}


值得注意的是,这并不像洛林的回答那样彻底,因为你忽略了括号的任何无效使用,
+
s或
-
s。你可能想将两者结合使用,或者使用最适合你需要的任何东西。

注意,这会起作用,但也会匹配
1+2-(10+30)
Edit:它还将只匹配一个空格,一个加号
+
,一个破折号
-
或一个括号
@Jimmy Yes)。它还可以与
(((((())))一起工作(()(++++--
出于这个原因。@h2ooooooo当然这不是一个完美的电话号码验证,但这也不是问题。问题是如何让正则表达式接受圆括号和空格。@zb226我同意-我实际上是在写同样的正则表达式。我只是在解释使用它可能带来的复杂性。当然,你是对的在技术上符合OPs要求,但是你只是让他的(已经不合适的)正则表达式变得更糟。你知道目标是什么,这是一个非常糟糕的正则表达式,对于这份工作来说,它只是给人一种错误的安全感,只接受有效的电话号码。“有效”电话号码,例如
+(2-5)((5-3)-4)-3
,或任何其他完全胡言乱语。在这个阶段,您最好完全删除正则表达式,它没有任何好处。+1.到目前为止,对于这里的要求来说,最好的正则表达式,并且很好的分解。但是,您没有处理OP特别提到的空格。通过在r中添加
\s*
显然可以很容易地解决这一问题在匹配之前提升位置或去除字符串中的所有空格。伟大的人!+1。你真的向我解释了正确的步骤。非常感谢:)如果我想成为这个数字
+011(+66)115-1221
这是gona作品
^\+?[0-9]+(\(\+?[0-9]+\)?[0-9-]*[0-9]$
?如何向正则表达式中添加空间?
\s
?完全正确。@Thor84no关于空间的说法是正确的,但是在开始时删除它们可能会更容易,这样正则表达式就更干净。例如,
$trimmed=str\u replace(“”,,$pattern);
当涉及电话号码和正则表达式时,给你一个警告——仅仅用正则表达式匹配普通电话号码几乎是不可能的(人们用太多不同的方式编写)。如果你用它来验证而不是发现,我建议去掉所有允许的非数字字符(
+-()
在本例中),包括空格,然后再进行测试。这样,您可以更好地控制结果,并避免像当前正则表达式匹配明显错误的数字之类的事情,例如
+
-
1
(您只需要一个字符).那么你的意思是从字符串中删除所有字符,然后进行测试,然后以某种方式格式化它?你能给我一个代码示例PHP我如何剥离所有字符并进行测试?谢谢!我为你添加了一个带有示例代码的答案。你对空格的看法是对的,但如果代码
regex
以可选空格alt的方式进行设置,对我来说没问题hough需要一些修正:(.非常感谢:)如果你同意Lorlin的回答,我建议在正则表达式中去掉空格,而不是让它们成为可选的,因为这使正则表达式更可读,因此更易于维护。我需要你的帮助去掉所有空格:(你能帮我吗?
str\u replace(“\s+”,“”)
这基本上意味着“匹配一个(或多个(
++
))空白字符(
\s
)-空格、新行、制表符等,并将其替换为零”。
str\u replace
将对在整个字符串中找到的每一个匹配执行此操作,这意味着最后将没有任何类型的空白。
^\+?[0-9]+(\([0-9]+\))?[0-9-]*[0-9]$