从字符串中剥离所有字符,只保留数字

33

嗨,我有一个像这样的字符串:

v8gn5.8gnr4nggb58gng.g95h58g.n48fn49t.t8t8t57

我想去掉所有的字符,只保留数字(和点号)。

有什么方法可以做到这一点吗?是否有预先构建的函数可以使用?

谢谢

5个回答

90
$str = preg_replace('/[^0-9.]+/', '', $str);

将不包含数字或小数点的子字符串替换为空。

这是它的工作原理:

  1. preg_replace是PHP函数,用于搜索一个字符串并将其替换为给定的替换字符串。
  2. preg_replace中的第一个参数是要搜索的正则表达式模式。在这种情况下,模式是'/[^0-9.]+/',它匹配任何不是数字或小数点的字符。方括号内的^字符表示“非”,因此[^0-9.]表示任何不是数字或小数点的字符。加号表示前一个字符或字符组的一个或多个出现,即在本例中为 [^0-9.]。
  3. preg_replace中的第二个参数是替换字符串。在这种情况下,替换字符串是一个空字符串''。因此,与第一个参数中的模式相匹配的任何字符都将被替换为一个空字符串。
  4. preg_replace中的第三个参数是要搜索和修改的输入字符串。在这种情况下,输入字符串由变量$str表示。

因此,这行代码将删除输入字符串$str中不是数字或小数点的所有字符,并返回只包含数字和小数点的修改后的字符串。


根据你的操作,上述函数需要转义点号。这在大型数据库导入过程中给我带来了很多麻烦。 - Marcelo Agimóvel
不,方括号中的字符本身是它们自己(大多数情况下是这样,除了^在开头表示NOT、-在两个其他字符之间表示RANGE、类的名称、像\t、\n等非打印二合字)。无论如何,在这种情况下,句点在[ ]内部不是特殊字符。因此,最好解释一下你想要转义句点的原因。 - Don

7
preg_replace('/[^0-9.]/', '', $string);

罗宾,没必要了。我在发布前已经测试过了,可以正常工作。 - Ionuț G. Stan
2
@Robin,如果句点在方括号[]之外,则需要转义。在方括号内部,句点不被视为特殊字符。 - Jonathan Fingland
2
@Robin:方括号内的文本定义了一组字符;在这种情况下,“.”字符表示任何字符并不是很有意义。 - Kevin Kibler

2
$input = 'some str1ng 234';
$newString = preg_replace("/[^0-9.]/", '', $input);

2
这是最短的一个:
$str = preg_replace('/\D/', '', $str);

\D = 所有非数字字符。


0
为满足我的好奇心,我询问了有关建议答案速度的问题,如preg_replace速度优化/所示,使用str_replace()比使用preg_replace()更快(多得多)。
因此,您可能希望改用str_replace()

1
但在这种情况下,您实际上不能使用str_replace(),除非您想硬编码所有不是数字的字符。 - Matteo Riva
1
@kemp,嗯...是的,那会太多了 :) - Veger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接