我想从包含数字和字母的字符串中提取数字,如:
"In My Cart : 11 items"
Run Code Online (Sandbox Code Playgroud)
我想在这里得到号码11或任何其他号码.
小智 500
如果您只想过滤除数字以外的所有内容,最简单的方法是使用filter_var:
$str = 'In My Cart : 11 items';
$int = (int) filter_var($str, FILTER_SANITIZE_NUMBER_INT);
Run Code Online (Sandbox Code Playgroud)
Gau*_*rav 334
$str = 'In My Cart : 11 12 items';
preg_match_all('!\d+!', $str, $matches);
print_r($matches);
Run Code Online (Sandbox Code Playgroud)
小智 275
preg_replace('/[^0-9]/', '', $string);
Run Code Online (Sandbox Code Playgroud)
这应该做得更好..!
Aka*_*eep 77
使用preg_replace:
$str = '(111) 111-1111';
$str = preg_replace('/\D/', '', $str);
echo $str;
Run Code Online (Sandbox Code Playgroud)
输出:1111111111
Yas*_*ash 19
对于浮点数,
preg_match_all('!\d+\.*\d*!', $string ,$match);
Run Code Online (Sandbox Code Playgroud)
请参阅我对更新的正则表达式的评论.
eap*_*apo 11
针对以下示例输入字符串的顶级资源友好型解决方案:
\n$string = "In My Cart : 11 items";\nRun Code Online (Sandbox Code Playgroud)\n最快:filter_var\xe2\x80\x94使用指定的过滤器过滤变量
var_dump(\n filter_var($string, FILTER_SANITIZE_NUMBER_INT)\n); // string(2) "11"\nRun Code Online (Sandbox Code Playgroud)\n几乎最快:str_replace\xe2\x80\x94 用替换字符串替换所有出现的搜索字符串
var_dump(\n str_replace(array(\'In My Cart : \',\' item\', \'s\'),"", $string)\n); // string(2) "11"\nRun Code Online (Sandbox Code Playgroud)\n足够快:preg_replace\xe2\x80\x94执行正则表达式搜索和替换
var_dump(\n preg_replace("/[^0-9]/","",$string)\n); // string(2) "11"\nRun Code Online (Sandbox Code Playgroud)\n然而
\nstr_replace速度快,但用例也有限preg_replace比or更通用str_replacefilter_varpreg_replace_callbackpreg_replace_callback可以在一次调用中进行多次替换filter_var卫生设施选择有限我没有这方面的功劳,但我只需要分享它.这个正则表达式将从一个字符串中获取数字,包括小数点/位数,以及逗号:
/((?:[0-9]+,)*[0-9]+(?:\.[0-9]+)?)/
引用自:
php - regex - 如何从字符串中提取带小数(点和逗号)的数字(例如1,120.01)?
小智 8
$str = 'In My Cart : 11 12 items';
$str = preg_replace('/\D/', '', $str);
echo $str;
Run Code Online (Sandbox Code Playgroud)
小智 7
你可以使用preg_match:
$s = "In My Cart : 11 items";
preg_match("|\d+|", $s, $m);
var_dump($m);
Run Code Online (Sandbox Code Playgroud)
由于字符串中只有 1 个需要隔离的数值,因此我个人会认可并filter_var()使用FILTER_SANITIZE_NUMBER_INT.
var_export(filter_var($string, FILTER_SANITIZE_NUMBER_INT));
// '11'
Run Code Online (Sandbox Code Playgroud)
一种更古怪的技术之所以有效,是因为只有 1 个数值,并且整数之前的唯一字符是字母、冒号或空格,即ltrim()与字符掩码一起使用,然后将剩余的字符串转换为整数。
var_export((int) ltrim($string, 'A..z: '));
// or ':..z ' (colon to z on ascii table and space)
// 11
Run Code Online (Sandbox Code Playgroud)
或者另一种前修剪字符串的方法是使用strpbrk()全数字字符掩码。 此页面专门介绍利用字符掩码的字符串函数,可能会更加清晰。
var_export((int) strpbrk($string, '0123456789'));
// 11
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因有多个整数值并且您想获取第一个整数值,那么正则表达式将是一种直接技术。
var_export(preg_match('/\d+/', $string, $m) ? $m[0] : '');
// '11'
Run Code Online (Sandbox Code Playgroud)
var_export(preg_replace('/\D*(\d+).*/', '$1', $string));
// '11'
Run Code Online (Sandbox Code Playgroud)
当然,如果字符串中只有一个数字,正如其他人所说,preg_replace()可以简单地破坏非数字字符。
演示
var_export(preg_replace('/\D+/', '', $string));
// '11'
Run Code Online (Sandbox Code Playgroud)
sscanf()如果您需要显式地将数字字符串转换为整数(或浮点数),则相当方便。如果整数值可能/未知出现在字符串的开头,则在扫描输入字符串之前在其前面添加一个非数字字符。以下技术匹配前导非数字(并*在 后忽略它们%),然后匹配第一个出现的数字序列并将返回的子字符串转换为整数。
var_export(sscanf(' ' . $string, '%*[^0-9]%d')[0]);
// 11
Run Code Online (Sandbox Code Playgroud)
要采用此技术来提取浮点值,只需将 更改d为f。有关(当前未记录的)分配抑制功能的更多信息sscanf(),请参阅这篇文章。
小智 6
$value = '25%';
Run Code Online (Sandbox Code Playgroud)
或者
$value = '25.025$';
Run Code Online (Sandbox Code Playgroud)
或者
$value = 'I am numeric 25';
$onlyNumeric = filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
Run Code Online (Sandbox Code Playgroud)
这将只返回数值
您可以使用以下功能:
function extract_numbers($string)
{
preg_match_all('/([\d]+)/', $string, $match);
return $match[0];
}
Run Code Online (Sandbox Code Playgroud)
小智 5
preg_match_all('!\d+!', $some_string, $matches);
$string_of_numbers = implode(' ', $matches[0]);
Run Code Online (Sandbox Code Playgroud)
在这种特定情况下,内爆中的第一个参数表示“用单个空格分隔 matches[0] 中的每个元素。” Implode 不会在第一个数字之前或最后一个数字之后放置空格(或无论您的第一个参数是什么)。
其他需要注意的是 $matches[0] 是存储找到的匹配项(与此正则表达式匹配)的数组的位置。
有关数组中其他索引的进一步说明,请参阅:http://php.net/manual/en/function.preg-match-all.php