Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.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_Class - Fatal编程技术网

PHP电话号码分析器

PHP电话号码分析器,php,class,Php,Class,仅为英国和爱尔兰构建应用程序,但可能扩展到其他国家。我们已经构建了一个API,我正在尝试决定A)如何存储电话号码B)如何编写解析器来理解所有输入和比较格式 e、 g 假设一个用户在爱尔兰,他们会以这些格式添加一个电话号码 0871231234 087 123 1234 087-1234 +35387123234 或以有效方式书写数字的任何其他组合。我们希望考虑到这一点,以便能够以一致的方式向我们的数据库中添加一个新的数字 因此,上述所有数字都可能存储为00353871234 问题是我还需要为所有

仅为英国和爱尔兰构建应用程序,但可能扩展到其他国家。我们已经构建了一个API,我正在尝试决定A)如何存储电话号码B)如何编写解析器来理解所有输入和比较格式

e、 g

假设一个用户在爱尔兰,他们会以这些格式添加一个电话号码

0871231234

087 123 1234

087-1234

+35387123234

或以有效方式书写数字的任何其他组合。我们希望考虑到这一点,以便能够以一致的方式向我们的数据库中添加一个新的数字

因此,上述所有数字都可能存储为00353871234


问题是我还需要为所有英国人做语法分析。有什么类可以帮助这个过程吗?

使用正则表达式。可以找到一个信息页面。它应该不会太难学,而且对你非常有用

以下是在英国验证电话号码的常规表达式:

^((\(?0\d{4}\)?\s?\d{3}\s?\d{3})|(\(?0\d{3}\)?\s?\d{3}\s?\d{4})|(\(?0\d{2}\)?\s?\d{4}\s?\d{4}))(\s?\#(\d{4}|\d{3}))?$
它允许3位、4位或5位地区前缀,分别带有8位、7位或6位电话号码,加上可选的3位或4位分机号码,前缀为#符号。还允许在区域前缀周围使用可选括号,并在适当的数字组之间使用可选空格。可以找到更多


Stackoverflow链接应该可以帮助您了解正则表达式如何与国际电话号码一起使用。

如果需要,设计英国第一个附加模块的基本功能。如果以后需要,您可以将每个国家/地区的逻辑分开。我倾向于谨慎乐观,你想接受尽可能多的数字吗

  • 去除空间、开口和闭合支架以及-
  • 如果数字以单个0开头,则替换为00
  • 如果数字以+开头,则替换为00
  • 如果它是数字,并且总长度在9到11个字符之间,则表示“良好”
  • 至于存储,您可以将其存储为字符串。。。或作为整数,第二个字段包含前缀“0”的数量

    以此为参考

    >尝试< /P>你应该考虑把号码存储为<代码> 353871231234版/COD>因为<代码> 00 < /C>不是所有国家的国际电话前缀。这里有一些维基百科文章可能有帮助:(参见)。简言之,E.164数字最多可以有15位数字。我猜否决票意味着您应该提供一个正则表达式示例。这是一个在PHP代码中使用正则表达式的示例,要了解正则表达式的含义和格式,请参阅我的答案。
    ?php
    $array = array
    (
            '0871231234',
            '087 123 1234',
            '087-1231234',
            '+353871231234'
    );
    
    foreach($array as $a)
            if(preg_match("/(^[0-9]{10}$)|(^[0-9]{3}\ [0-9]{3}\ [0-9]{4}$)|(^[0-9]{3}\-[0-9]{7}$)|(^\+353[0-9]{9}$)/", $a))
            {
                    // removes +35
                    $a = preg_replace("/^\+[0-9]{2}/", '', $a);
                    // removes first number
                    $a = preg_replace("/^[0-9]{1}/", '', $a);
                    // removes spaces and -
                    $a = preg_replace("/(\s+)|(\-)/", '', $a);
                    $a = "00353".$a;
                    echo $a."\n";
            }
    ?>