我想从一个包含数字和字母的字符串中提取数字,比如:
"In My Cart : 11 items"
我想提取数字11。
我想从一个包含数字和字母的字符串中提取数字,比如:
"In My Cart : 11 items"
我想提取数字11。
当前回答
由于在字符串中只有1个数字值需要隔离,我将支持并个人使用filter_var()和FILTER_SANITIZE_NUMBER_INT。
echo filter_var($string, FILTER_SANITIZE_NUMBER_INT);
一种更古怪的技术是使用带字符掩码的ltrim(),然后将剩余的字符串强制转换为整数,因为只有1个数值,并且在整数之前的唯一字符是字母、冒号或空格。
Demo
$string = "In My Cart : 11 items";
echo (int)ltrim($string, 'A..z: ');
// 11
如果由于某种原因,有多个整数值,而您想获取第一个整数值,那么regex将是一种直接的技术。
Demo
echo preg_match('/\d+/', $string, $m) ? $m[0] : '';
如果需要显式地将数字字符串转换为整数(或浮点数),Sscanf()非常方便。如果整数值可能/未知地出现在字符串的开头,则在扫描输入字符串之前在输入字符串前加上一个非数字字符。下面的技术匹配前导非数字(并在%后面使用*忽略它们),然后匹配第一个出现的数字序列并将返回的子字符串转换为整数。
Demo
var_dump(sscanf(' ' . $string, '%*[^0-9]%d')[0]);
要适应这种技术来提取一个浮点值,只需将d更改为f。有关sscanf()的赋值抑制特性的更多信息(目前没有记录),请参阅本文。
其他回答
preg_match_all('!\d+!', $some_string, $matches);
$string_of_numbers = implode(' ', $matches[0]);
在本例中,implode中的第一个参数表示“用单个空格分隔匹配[0]中的每个元素。”Implode不会在第一个数字之前或最后一个数字之后放置空格(或任何你的第一个参数)。
另外需要注意的是$matches[0]是存储匹配数组(匹配此正则表达式)的地方。
有关数组中其他索引的进一步说明,请参阅:http://php.net/manual/en/function.preg-match-all.php
如果你只想过滤除数字以外的所有内容,最简单的方法是使用filter_var:
$str = 'In My Cart : 11 items';
$int = (int) filter_var($str, FILTER_SANITIZE_NUMBER_INT);
顶级资源友好型解决方案
<?php
var $string = "In My Cart : 11 items";
?>
1. 最快:filter_var -使用指定的过滤器过滤变量
<?php
filter_var($string, FILTER_SANITIZE_NUMBER_INT); // string(2) "11"
?>
2. 几乎是最快的:str_replace—用替换字符串替换所有搜索字符串
<?php
str_replace(array('In My Cart : ',' item', 's'),"", $string); // string(2) "11"
?>
3.足够快:preg_replace -执行正则表达式搜索和替换
<?php
preg_replace("/[^0-9]/","",$string); // string(2) "11"
?>
然而
str_replace的简单性导致速度加快,但用例也有限 Preg_replace比str_replace或filter_var更通用 相反,可以使用preg_replace_callback函数指定要替换的内容 使用preg_replace_callback可以在一次调用中执行多个替换 Filter_var在环卫选项中受限
我们可以从它中提取int
$string = 'In My Car_Price : 50660.00';
echo intval(preg_replace('/[^0-9.]/','',$string)); # without number format output: 50660
echo number_format(intval(preg_replace('/[^0-9.]/','',$string))); # with number format output :50,660
演示:http://sandbox.onlinephpfunctions.com/code/82d58b5983e85a0022a99882c7d0de90825aa398
按照这一步,它将把字符串转换为数字
$value = '$0025.123';
$onlyNumeric = filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
settype($onlyNumeric,"float");
$result=($onlyNumeric+100);
echo $result;
另一种说法是:
$res = preg_replace("/[^0-9.]/", "", "$15645623.095605659");