我想从一个包含数字和字母的字符串中提取数字,比如:

"In My Cart : 11 items"

我想提取数字11。


当前回答

preg_replace('/[^0-9]/', '', $string);

这应该做得更好!

其他回答

对于浮点数,

preg_match_all('!\d+\.?\d+!', $string ,$match);

谢谢你指出错误。@mickmackusa

如果你不知道数字的格式?Int或float,然后使用这个:

$string = '$125.22';

$string2 = '$125';

preg_match_all('/(\d+.?\d+)/',$string,$matches); // $matches[1] = 125.22

preg_match_all('/(\d+.?\d+)/',$string2,$matches); // $matches[1] = 125

由于在字符串中只有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 items';
$num = '';

for ($i = 0; $i < strlen($str); $i++) {

    if (is_numeric($str[$i])) {
        $num .= $str[$i];
    }
}

echo $num; // 11

尽管我同意regex或filter_var()在上述情况下更有用。

这个函数也将处理浮点数

$str = "Doughnuts, 4; doughnuts holes, 0.08; glue, 3.4";
$str = preg_replace('/[^0-9\.]/','-', $str);
$str = preg_replace('/(\-+)(\.\.+)/','-', $str);
$str = trim($str, '-');
$arr = explode('-', $str);