从字符串中删除非数字字符(不包括句点和逗号)(即删除除数字、逗号和句点之外的所有字符)
Posted
技术标签:
【中文标题】从字符串中删除非数字字符(不包括句点和逗号)(即删除除数字、逗号和句点之外的所有字符)【英文标题】:Remove non-numeric characters (excluding periods and commas) from a string (i.e. remove all characters except numbers, commas, and periods) 【发布时间】:2022-01-22 22:06:41 【问题描述】:如果我有以下值:
$var1 = AR3,373.31
$var2 = 12.322,11T
如何创建一个新变量并将其设置为删除了任何非数字字符(逗号和句点除外)的数据副本?上面的值将返回以下结果:
$var1_copy = 3,373.31
$var2_copy = 12.322,11
【问题讨论】:
对于希望从字符串中删除所有非数字字符(包括分隔符)的研究人员,请参阅 String Sanitization: How to remove all non-numeric characters from a string?(大约 2011 年 8 月) 【参考方案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. 回答者收到了他们不应该收到的“信任点”。 “在整个编辑历史中保留逗号和点的要求一直是一致的”是的,但直到这个答案几个月后,它才被标题的措辞所掩盖。 请考虑删除这个不正确的答案。不正确的答案会影响正确的答案,并可能使研究人员感到困惑,并浪费研究人员阅读不适当的见解的时间。这是另一个漏掉的内容示例:***.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"
【讨论】:
重要:这只会从字符串中删除字母。其他字符,如空格、括号、引号等,都保留在结果中。 --> 如果你知道你的输入字符串只包含字母和数字,没有其他字符,只能使用这个解决方案!以上是关于从字符串中删除非数字字符(不包括句点和逗号)(即删除除数字、逗号和句点之外的所有字符)的主要内容,如果未能解决你的问题,请参考以下文章
检测 VB.Net 中数字的文化,即小数点/千位分隔符的句点或逗号