【问题标题】:Remove non-numeric characters (excluding periods and commas) from a string (i.e. remove all characters except numbers, commas, and periods)从字符串中删除非数字字符(不包括句点和逗号)(即删除除数字、逗号和句点之外的所有字符)
【发布时间】:2011-06-24 08:55:31
【问题描述】:

如果我有以下值:

 $var1 = AR3,373.31

 $var2 = 12.322,11T

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

 $var1_copy = 3,373.31

 $var2_copy = 12.322,11

【问题讨论】:

标签: php


【解决方案1】:

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

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

模式也可以表示为/[^\d,.]+/

【讨论】:

  • 另见 php 函数 money_function() (php.net/manual/en/function.money-format.php)
  • [^0-9] 将匹配任何非数字字符,因此无需添加逗号和句号。这就足够了: echo preg_replace('/[^0-9]/','',$testString);
  • @billrichards 我不认为这是正确的。请记住,他希望保留逗号和句号以及数字字符,而不是删除它们。
  • @billrichards 正如 OP 所述(强调我的),“避免使用字母或字符逗号和点除外”。
  • 那个句号不需要反斜杠吗?句号的意思是“任何字符”不是吗?
【解决方案2】:

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

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

$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 的当前库中使用正则表达式要快(尽管字面意思是纳秒级)。

【讨论】:

    【解决方案3】:

    真正删除所有非数字字符的最简单方法:

    echo preg_replace('/\D/', '', $string);
    

    \D代表“任何非十进制数字的字符”

    http://php.net/manual/en/regexp.reference.escape.php

    【讨论】:

    • 这不适用于 OP 的要求。这是另一个问题的正确答案。
    • @mickmackusa 你是对的。自从我写下这个答案以来,这个问题已经被大量编辑。不过,这似乎是有用的信息。
    • 保留逗号和点的要求在整个编辑历史记录中是一致的。当不正确的答案被高度评价时,我总是很失望,因为 1. 答案误导研究人员或发布在错误的页面上,以及 2. 回答者收到了他们不应该收到的“信任点”。
    • “在整个编辑历史中保留逗号和点的要求一直是一致的”是的,但直到这个答案几个月后,它才被标题的措辞所掩盖。
    • 请考虑删除这个不正确的答案。不正确的答案会影响正确的答案,并可能使研究人员感到困惑,并浪费研究人员阅读不适当的见解的时间。这是另一个漏掉的内容示例:stackoverflow.com/a/37500756/2943403当内容被证明不正确时,堆栈溢出是一种不太有效的研究工具。所有这些赞成票都是不正当的。
    【解决方案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()Sanitize filters的信息

    【讨论】:

      【解决方案5】:

      如果字母总是在开头或结尾,您可以简单地使用 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"
      

      【讨论】:

      • 重要:这只会从字符串中删除字母。其他字符,如空格、括号、引号等,都保留在结果中。 --> 如果你知道你的输入字符串只包含字母和数字,而没有其他字符,只能使用这个解决方案!
      猜你喜欢
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 2016-08-17
      • 1970-01-01
      相关资源
      最近更新 更多