【问题标题】:Splitting up a phone number in php在php中拆分电话号码
【发布时间】:2010-09-21 14:19:41
【问题描述】:

好的,我有一个包含字符串 (407)888-9999 的变量 $phone,我有这个代码

 if($phone != ''){ $phone = "<span id='telephone'>{$phone}</span>";}
return $phone;

这工作正常,但现在客户希望在区号和接下来的三个数字之间有一些填充。所以我需要代码是这样的

<span id='telephone'><span class='spacer'>(407)</span>888-9999</span>";

【问题讨论】:

    标签: php css


    【解决方案1】:

    鉴于没有其他人提到这一点,我会从数字中删除所有非数字字符。完成后,您可以使用正则表达式轻松获取数字,这样任何格式都是有效的,几乎无论用户输入什么,您都可以按照自己的意愿进行格式化:

    $phone = preg_replace("~[^0-9]~", "", $phone);
    preg_match('~([0-9]{3})([0-9]{3})([0-9]{4})~', $phone, $matches);
    
    if (!empty($matches)) {
        $display = "<span id='telephone'><span class='spacer'>(" . 
                    $matches[1] . ")</span>" . $matches[2] . "-" . $matches[3] . "</span>";
    }else {
        $display = "An invalid phone number was entered.";
    }
    

    只要有 10 位数字,无论如何输入电话号码都应该这样做。

    更新

    您还可以将preg_replace 技术与substr 一起使用,而无需使用preg_match。这实际上是我的首选解决方案。

    $phone = preg_replace("~[^0-9]~", "", $phone);
    
    if (strlen($phone) == 10) {
        $display = "<span id='telephone'><span class='spacer'>(" . 
                    substr($phone,0,3) . ")</span>" . substr($phone,2,3) . "-" . substr($phone,5,4) . "</span>";
    }else {
        $display = "An invalid phone number was entered.";
    }
    

    【讨论】:

      【解决方案2】:

      您确定字符串格式正确吗?如果是这样,您可以将其分解为子字符串:

       $phone = "<span id='telephone'><span class='spacer'>{substr($phone, 0, 5)}</span>{substr($phone, 5, 8)}";
      

      【讨论】:

      • 另一方面:如果您不知道字符串的格式是否正确,这将失败并出现一堆错误:) 在这种情况下,您需要大量额外的逻辑来找出正确的字符串的格式。在这种情况下,正则表达式可能会证明一个更简单的解决方案。
      • 如果数据是从用户那里获取的,我同意。但是,在这种情况下,应该进行更多的消毒(超出此问题的范围)。如果数据是从数据库中检索的,您可以假设它在输入过程中已经过清理,并为自己节省一些不必要的开销。
      【解决方案3】:

      你可以这样做:

      $input = "(407)888-9999";
      $area_code = ''; 
      $ph_num = $input;
      if(strpos($input,')') !== false) { // if area-code is present.
              list($area_code,$ph_num) = explode(')',$input); 
              $area_code .= ')';
      }
      

      【讨论】:

        【解决方案4】:

        如果电话号码始终采用相同的格式,您可以将其拆分为:

        list($area,$phone1,$phone2) = sscanf($phone,'(%d)%d-%d');
        

        sscanf($phone,'(%d)%d-%d',$area,$phone1,$phone2)
        

        【讨论】:

          【解决方案5】:

          你需要regular expressions

          <?php 
            preg_match("/(\([^\)*]\))(.*)/", $phone, &$matches);
            var_dump($matches);
            print "<span id='telephone'><span class='spacer'>({$matches[1]})</span>$matches[2]</span>";
          ?>
          

          【讨论】:

          • 如果已知字符串格式正确(通过任何先前的验证),则正则表达式是矫枉过正 - 过于复杂且过度占用处理器。
          • 引用经常被引用的 Jamie Zawinski 的话:“有些人在遇到问题时会想‘我知道,我会使用正则表达式。’现在他们有两个问题。”
          • @James Burgress,虽然很有趣,有时甚至可能是低谷,但 /are/ 有很多使用正则表达式的有效和好地方。解析电话号码就是这样的领域之一。
          • 当然可以,但是对于简单的插入空格(这是所有 OP 要求的,我们假设他已经验证了数字格式),正则表达式是多余的。
          【解决方案6】:

          只要您确定电话号码在区号周围有括号,您就可以像这样使用简单的 str_replace ...

          $phone = "(902)555-1234";
          
          if($phone != ''){
              $phone = str_replace(")", ") ",$phone);
              $phone = "<span id='telephone'>{$phone}</span>";
          }
          return $phone;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-11-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多