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

"In My Cart : 11 items"

我想提取数字11。


当前回答

使用sscanf的替代解决方案:

$str = "In My Cart : 11 items";
list($count) = sscanf($str, 'In My Cart : %s items');

其他回答

由于在字符串中只有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()的赋值抑制特性的更多信息(目前没有记录),请参阅本文。

对于utf8 str:

function unicodeStrDigits($str) {
    $arr = array();
    $sub = '';
    for ($i = 0; $i < strlen($str); $i++) { 
        if (is_numeric($str[$i])) {
            $sub .= $str[$i];
            continue;
        } else {
            if ($sub) {
                array_push($arr, $sub);
                $sub = '';
            }
        }
    }

    if ($sub) {
        array_push($arr, $sub); 
    }

    return $arr;
}

这个函数也将处理浮点数

$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);
preg_replace('/[^0-9]/', '', $string);

这应该做得更好!

$value = '25%';

Or

$value = '25.025$';

Or

$value = 'I am numeric 25';
$onlyNumeric = filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

这将只返回数值