Php 根据电话号码确定国家

Php 根据电话号码确定国家,php,regex,preg-match,Php,Regex,Preg Match,我见过一些问题与我的要求如此相似,但似乎没有什么符合我的要求 我需要处理通话记录并确定使用电话号码的国家/地区。拨打的号码可以是任何国家/地区,例如: 44 7899455120-英国 34 965791845-西班牙 355 788415235-阿尔巴尼亚 显然,如果所有的呼叫代码都是两位数的话,这个世界将是美好的,但事实并非如此。目前,我有一个数据库,里面有国家及其相关代码,为了匹配,我需要有效地取数字的第一位,例如英国的4,并对数据库进行查询,例如: SELECT * from count

我见过一些问题与我的要求如此相似,但似乎没有什么符合我的要求

我需要处理通话记录并确定使用电话号码的国家/地区。拨打的号码可以是任何国家/地区,例如:

44 7899455120-英国

34 965791845-西班牙

355 788415235-阿尔巴尼亚

显然,如果所有的呼叫代码都是两位数的话,这个世界将是美好的,但事实并非如此。目前,我有一个数据库,里面有国家及其相关代码,为了匹配,我需要有效地取数字的第一位,例如英国的
4
,并对数据库进行查询,例如:

SELECT * from countries WHERE code LIKE '4%'
例如,这可能会给我20个结果。所以我再次循环并说

SELECT * from countries WHERE code LIKE '44%'
这可能会给我一个结果,现在我可以确定它是英国。然而,有些代码(如阿尔巴尼亚代码)是三位数的,需要更多的循环和数据库调用。这似乎是相当初级和低效的,但我想不出另一种方法来实现这一点。我意识到对一个数据库的三次呼叫似乎不多,但如果你有1000个呼叫要处理,它们很快就会加起来

请看以下问题:

关于根据国家代码验证数字,似乎有一些很好的信息,但关于根据数字确定国家代码的信息并不多。任何关于清洁方法的建议都将不胜感激



为清晰起见,手机中的空格会显示出来

假设手机的外观总是这样:

$phone = "355 788415235"; // Albania
$parts = explode(" ", $phone);
$code = $parts[0]; // First part separated by space, 355.
然后直接用它来查询。不需要正则表达式


如果不是这样,请考虑将国家代码与输入级别上的数字分开。在系统上,

,每个电话号码在国家代码之后都有空格,因此您可以使用它来确定国家。< /P>

  • 创建一个包含所有国家/地区代码的表。勒克

    id|国家|代码

    1 |土耳其| 90

    2 |西班牙| 34

  • (有一张桌子给你:)

    而不是爆出你的电话号码。Delimeter为空白“”


    国家代码中不存在重叠歧义。含义:国家代码11是非法的,因为1被分配到北美。同样,20是埃及,没有其他国家代码以20开头。以21开头的国家代码都是3位数字

    由于没有重叠歧义,您可以在一次查询中直接搜索电话号码12125551212的国家代码,如下所示:

    select country
         , code
      from countrycodes
     where code in ('121', '12', '1')
    

    同样,没有国家代码121或12,因此唯一匹配的标准是1。

    存在一个库,它将解析一串数字并将其重新格式化为国际标准(类似4402081231234到“+44 20 8123 1234”的数字)。如果号码中嵌入了国家代码,它还将从号码中返回电话号码区域“GB”或“US”


    最初的库是用Java编写的,但也有Javascript、Python、Ruby和PHP等版本。

    如果没有特定的匹配点,这可能是不可能的。世界上只有196个国家,没有什么大不了的……你应该考虑用第三方提供的服务来运行一个更通用的查找,或者是一个包含“C++长度”的查找表来进行“最佳猜测”。您还可以在ITU(推荐)上找到规范,例如,请参见牙买加与美国的不同之处()或以色列/巴勒斯坦或卫星服务如何共享“前缀”(CC)。您可以提供什么样的搜索参数?我的意思是,你发送到MySQL获取数据的输入,因为根据这一点,我们可以给你一个更好的答案“>URL问题是关于谷歌图书馆libphonenumber的。请看是不是这样helpful@TheHumbleRat那就不可能了。因为
    1234567
    1234567
    都是有效数字。如果没有空格,两个不同的数字将成为同一个数字。在输入级别将这两个数字分开。不,这两个数字无效。标准中没有歧义。我从来没有接受过这个答案,但我现在一直在使用这个库。@TheHumbleRat我正在试图理解这是如何解决你的问题的。阅读文档看起来,您需要提供
    编号
    国家
    来创建编号原型对象。对的“我是不是错过了什么?”斯蒂文说,我也在想同样的事情。传入的国家/地区代码是默认的国家/地区代码,仅当提供的号码无法用于确定国家/地区代码时才使用。库无法分析样本号。除非你的前缀是“+”。现在链接是404。我想建议基于@longneck answer的改进<代码>从电话号码=(选择左侧(变量电话号码,1))或电话号码=(选择左侧(变量电话号码,2))或电话号码=(选择左侧(变量电话号码,3))的国家/地区中选择国家/地区名称。
    select country
         , code
      from countrycodes
     where code in ('121', '12', '1')