【问题标题】:Remove everything but numbers, the letter x, and the plus sign (Regex, PHP)删除除数字、字母 x 和加号之外的所有内容(Regex、PHP)
【发布时间】:2011-11-12 10:07:31
【问题描述】:

存在这个问题的许多变体,我尝试了一些生成器,但似乎找不到与此匹配的正则表达式。假设我有一个看起来像“345-324-3243 X039”的电话号码,我想删除除数字、字母 x 和加号(出现在国际号码中)之外的所有内容。

这是我当前无法使用的正则表达式和代码:

$phone = "345-324-3243 X039";
preg_replace('[^\d|x|\+]', '', $phone);

我希望它显示为“3453243243X039”,但我得到的是“30234-2349”。

【问题讨论】:

    标签: php regex preg-replace


    【解决方案1】:

    所以您的结果中不仅有剩余的- 字符,而且是完全不同的数字?这对我来说很奇怪。你不能仅仅通过删除字符从345-324-3243 X039得到30234-2349;该输入中唯一的0 就在末尾附近。这几乎就像角色被洗牌和删除一样。

    我确实注意到您的模式周围没有正则表达式分隔符。我什至不知道这样做会产生什么影响,因为我不记得曾经尝试过它,但这是您的正则表达式中唯一的功能问题。字符类中的 |s 将被解释为文字 | 字符,但这不会影响您发布的示例输入的结果。

    我要使用的代码是这样的:

    $phone = preg_replace('/[^\dx+]/i', '', $phone);
    

    我已经将正则表达式包裹在 /.../ 分隔符中,删除了 |,未转义 +(在字符类中不应该有任何影响),并使其不区分大小写以捕获大写 X .

    【讨论】:

      【解决方案2】:

      丢失|,因为它是字符类中的文字,确保捕获大写“X”(以及小写“x”),使用正则表达式“/quotes/”(否则它认为是作为 "[quotes]") 并使用结果:

      $phone = "345-324-3243 X039";
      $phone = preg_replace('/[^\dxX+]/', '', $phone);
      // $phone is 3453243243X039
      

      编码愉快。

      【讨论】:

        【解决方案3】:

        从您的正则表达式中删除 |s 并转义 +。

        【讨论】:

        • + 已经被转义,即使在字符类中不需要它也是如此。您认为 | 是不必要的是正确的,但它不应影响此输入的结果。
        猜你喜欢
        • 2012-10-24
        • 2011-11-08
        • 2012-07-31
        • 2010-10-24
        • 2012-09-02
        • 2012-11-15
        • 1970-01-01
        • 1970-01-01
        • 2015-07-26
        相关资源
        最近更新 更多