PHP:使用MySQL数据库从电话号码中分离区号

时间:2017-09-28 12:15:37

标签: php mysql regex phone-number

我想使用区号mysql数据库将区号与电话号码字符串分开。

例如,字符串为0349152023 结果应该是03491 52023

为了得到结果,我想分割字符串并搜索数据库中的每个数字 例如0然后3然后4,然后获取最后找到的结果。

我目前的代码只是准备电话号码字符串以进行进一步的操作:

$phone1 = preg_replace('/[oO]/', '0', $phone-string);

$phone2 = preg_replace("/[^0-9]/", "", $phone1);

然后我使用str_split将字符串剪成碎片:

$searchArray = str_split($phone2);

感谢您的帮助。

5 个答案:

答案 0 :(得分:1)

您可以构建一个包含所有区号的数组。 然后你可以这样写:

foreach ($area_codes as $code) {
  if (substr($phone, 0, strlen($code)) == $code) {
    $phone_string = substr($phone, 0, strlen($code))." ".substr($phone, strlen($code));
  }
}

显然,您可以添加一个控制器,以验证是否找到了区号。

答案 1 :(得分:0)

步骤1:从db中选择所有区域代码并将它们放入数组$areaCodes

第2步:将$ areaCodes迭代为$ code并检查phonenumber是否以$ code开头。如果是这样,创建一个字符串,在代码和数字的其余部分之间有一个空格

$phonenumber = '0349152023';

$preparedPhonenumber = '';
foreach($areaCodes as $code){
    if(str_pos($phonenumber, $code) === 0){
        // phonenumber starts with areacode

        $phoneWithoutCode = substr($phonenumber, strlen($code));
        $preparedPhonenumber = $code.' '.$phoneWithoutCode;

        break;
    }
}
// if one of the areaCodes was 0349,
// the variable $preparedPhonenumber is now '0349 152023'

编辑:您可以通过仅选择以某个字符串开头的那些来缩短从db返回的区域代码量。

让我们假设德国最短的区号是3位数(我认为是正确的)。

$threeDigits = substr($phonenumber,0,3);
$query = "SELECT * from areacodes
         WHERE code like '".$threeDigits."%'
         ORDER BY CHAR_LENGTH(code) DESC";

这将大大缩小可能的区域代码数组,从而使脚本更快。

编辑 2:在查询中添加order by子句,以便上面的代码首先检查更长的areacodes。 (foreach循环中的break;现在是强制性的!)

答案 2 :(得分:0)

嗨Leonardo Gugliotti和Cashbee

我对areaCodes进行排序以获得更好的匹配。 php脚本工作正常,但需要很长时间才能处理5000个MySQL条目。是否有可能直接在mySQL中进行foreach搜索?

<?php
$sample_area_codes = array( '0350', '034', '034915', '03491', '0348', '0349', '03491', '034916', '034917',);
sort($sample_area_codes);

$phone_string = '0349152023';

foreach ($sample_area_codes as $code) {
    $subString = substr($phone_string, 0, strlen($code));
    if ($subString == $code) {
        $phone = $subString." ".substr($phone_string, strlen($code));
    }
}

if (!empty($phone)) {
    echo $phone;
}

else {
    echo "No AreaCode found.";
}
?>

输出:034915 2023,这是正确的

答案 3 :(得分:0)

单个探测器(假设为INDEX(area_code)):

 SELECT ...
     FROM AreaCodes
     WHERE area_code < ?
     ORDER BY area_code DESC
     LIMIT 1;

(将$phone_number作为字符串绑定到?

答案 4 :(得分:0)

我认为你最好将你的数据库分成一个树,为每个数字制作一个表 所以第三个数字可以指第二个数字,第四个数字指的是第三个数字,依此类推,直到达到前缀的最大长度。最后一个表应包括该区域的名称 按照您的示例,假设区号的最大长度为五位数,则fifth_digit_table应至少包含四个字段,如下所示:
ID
IDREF

姓名

10条记录可能具有相同的IDref,对应于第四个位置的数字“2”,链接到前一个“021”到第四个_digit_table,三个_digit_table等等;这些记录中只有一个,数字字段填充“9”,应该具有名称“Haan”;其他人,如果没有,应该有“索林根”这个名字 我希望你能设法加速你的剧本。