【问题标题】:Remove all non-numeric characters from a string; [^0-9] doesn't match as expected从字符串中删除所有非数字字符; [^0-9] 与预期不匹配
【发布时间】:2011-09-30 01:45:28
【问题描述】:

我正在尝试从字符串中删除所有内容,但仅删除数字 (0-9)。

我认为这会起作用..

echo preg_replace("[^0-9]","",'604-619-5135');

但它会回显“604-619-5135”。我错过了什么???

【问题讨论】:

标签: php regex string phone-number sanitization


【解决方案1】:

试试这个:

preg_replace('/[^0-9]/', '', '604-619-5135');

preg_replace 使用通常以/ 开头和结尾的 PCRE。

【讨论】:

  • 内部/双引号与 PCRE 没有任何关系。显然(在 (?flags) 之前的日子里)设计/编写函数/API 的人认为使用双引号 /flags 形式传递正则表达式标志而不是使用额外的函数参数是个好主意。
  • @Qtax: 好点,是的,我知道我们从 ("g/re/p") 中得到 "grep" 这个词
  • 在 las 部分添加字符似乎不会删除该部分
  • 或者只是简单地使用/\D/获取数字或/\d/获取字符串。
【解决方案2】:

这是给未来的开发者的,你也可以试试这个。也很简单

echo preg_replace('/\D/', '', '604-619-5135');

【讨论】:

  • 我已经回来了 2 未来,我可以确认他们仍然没有找到更好的方法。
  • @Eoin 使这种模式“更好”在D 之后添加一个或多个量词 (+)。这允许正则表达式引擎进行更长的替换,从而减少替换。想象一下站在一盒鸡蛋面前。如果我让你拿起一打鸡蛋,你会做 12 个深蹲还是只做 1 个?虽然我喜欢锻炼,但为了直接起见,我会蹲一次并捡起所有的鸡蛋。
【解决方案3】:

您需要将模式括在分隔符中 - 通常使用斜杠 (/)。试试这个:

echo preg_replace("/[^0-9]/","",'604-619-5135');
【解决方案4】:

对于那些不想使用正则表达式的人来说,这是一种更实用的方法:

$data = filter_var($data, FILTER_SANITIZE_NUMBER_INT);

注意:它也适用于电话号码。

【讨论】:

  • FILTER_SANITIZE_NUMBER_INT 留下加号 + 和减号 -,而不仅仅是数字。
  • 是的,我说它适用于像 +905360000000 这样的电话号码,忽略了所有其他字符
  • 这是例如如果您尝试将它与 Whatsapp 一起使用,则会出现问题,因为 WA 不允许 + 符号!
  • 这个答案对于提出的问题完全无效。证明:3v4l.org/IMQeJ
猜你喜欢
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 2013-04-30
  • 2011-10-19
  • 1970-01-01
  • 2010-12-04
  • 2010-11-17
  • 2014-04-26
相关资源
最近更新 更多