我想从一个包含数字和字母的字符串中提取数字,比如:
"In My Cart : 11 items"
我想提取数字11。
我想从一个包含数字和字母的字符串中提取数字,比如:
"In My Cart : 11 items"
我想提取数字11。
当前回答
其他方式(unicode字符串甚至):
$res = array();
$str = 'test 1234 555 2.7 string ..... 2.2 3.3';
$str = preg_replace("/[^0-9\.]/", " ", $str);
$str = trim(preg_replace('/\s+/u', ' ', $str));
$arr = explode(' ', $str);
for ($i = 0; $i < count($arr); $i++) {
if (is_numeric($arr[$i])) {
$res[] = $arr[$i];
}
}
print_r($res); //Array ( [0] => 1234 [1] => 555 [2] => 2.7 [3] => 2.2 [4] => 3.3 )
其他回答
按照这一步,它将把字符串转换为数字
$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");
使用sscanf的替代解决方案:
$str = "In My Cart : 11 items";
list($count) = sscanf($str, 'In My Cart : %s items');
对于浮点数,
preg_match_all('!\d+\.?\d+!', $string ,$match);
谢谢你指出错误。@mickmackusa
由于在字符串中只有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()的赋值抑制特性的更多信息(目前没有记录),请参阅本文。
$str = 'In My Cart : 11 12 items';
preg_match_all('!\d+!', $str, $matches);
print_r($matches);