从字符串中删除非数字字符(句号和逗号除外)


150

如果我具有以下值:

 $var1 = AR3,373.31

 $var2 = 12.322,11T

我如何创建一个新变量并将其设置为除去了任何非数字字符的数据副本(逗号和句点除外)?上面的值将返回以下结果:

 $var1_copy = 3,373.31

 $var2_copy = 12.322,11

Answers:


335

您可以使用preg_replace换出所有非数字字符以及逗号和句号/句号,如下所示:

<?php
    $testString = '12.322,11T';
    echo preg_replace('/[^0-9,.]/', '', $testString);
?>

6
又见PHP函数money_function()(php.net/manual/en/function.money-format.php
霍雷肖

5
[^ 0-9]将匹配任何非数字字符,因此不必添加逗号和句号。这就足够了:echo preg_replace('/ [^ 0-9] /','',$ testString);
billrichards 2014-3-18

6
@billrichards我认为这是不正确的。记住,他想保留逗号和句号以及数字字符,而不是删除它们。
Richt222

1
@billrichards如OP所述(强调我的意思),“避免使用字母或字符(逗号和点除外) ”。
约翰·帕克

那段时间不需要反斜杠吗?句号的意思是“任何字符”,不是吗?
斯科特(Scott)

66

我很惊讶这里没有提到filter_var,因为这是一个老问题了...

PHP具有使用清除过滤器执行此操作的内置方法。具体来说,在这种情况下使用的是FILTER_SANITIZE_NUMBER_FLOAT带有FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND标志的。像这样:

$numeric_filtered = filter_var("AR3,373.31", FILTER_SANITIZE_NUMBER_FLOAT,
    FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND);
echo $numeric_filtered; // Will print "3,373.31"

这也可能是值得指出的是,因为它的内置到PHP,这是(字面上虽然在纳秒)的速度比使用正则表达式与PHP的当前库。


2
IMO这是最好的答案。
Ogier Schelvis,2016年


4

您可以filter_var删除所有非法字符,数字,点和逗号除外。

  • FILTER_SANITIZE_NUMBER_FLOAT过滤器用于去除从字符串中的所有非数字字符。
  • FILTER_FLAG_ALLOW_FRACTION 允许分数分隔符 " . "
  • FILTER_FLAG_ALLOW_THOUSAND从字符串中获取逗号的目的。

$var1 = '12.322,11T';

echo filter_var($var1, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND);

输出量

12.322,11

阅读有关filter_var()清理过滤器的更多信息


2

如果请求要删除所有(且不仅是一个)非数字字符,则可以以非常简单的方式像这样写前一个字符(但是您可以编写一个函数来传递字符串,并使其返回不带字符的所需值。 ..反正..):

<?php
$String1 = 'AR3,373.31';
$String2 = '12.322,11T';

echo preg_replace('/[^0-9,.]+/i', '', $String1);
echo preg_replace('/[^0-9,.]+/i', '', $String2);
?>

1

如果字母始终在开头或结尾,则只需使用trim ...无需正则表达式

$string = trim($string, "a..zA..Z"); // this also take care of lowercase

"AR3,373.31" --> "3,373.31"
"12.322,11T" --> "12.322,11"
"12.322,11"  --> "12.322,11"

重要提示:这只会从字符串中删除字母。其他字符(例如空格,方括号,引号等)将保留在结果中。->仅在您知道输入字符串仅包含字母和数字而没有其他字符的情况下,才使用此解决方案!
菲利普

-1

与middaparka的答案相同,但删除,.

$unformatted_phone = "phone 122-3222223.ext 442";
echo preg_replace("/[^0-9]/", "", $unformatted_phone);

请不要在帖子中添加指向您的博客/网站的链接。那可以被视为垃圾邮件。
Tushar

Downvote:因为middaparka的答案很完美。OP希望保留点和逗号,但您的答案将其删除。
Carlos2W '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.