我有一个这样的字符串:
$string = 'e.g. 25.32';
我只想提取数字(25.32)
数字周围的文本可能是任何非数字。
你可以使用类似的东西:
<?php
$str = "e.g. 25";
$val = (int)$str;
?>
但这不是最好的解决方案。
一个“更强大”和普遍的替代方案是......
代码:(更新)
<?php
$str = "e.g. 25.32";
preg_match("/([0-9]+[\.,]?)+/",$str,$matches);
$val = $matches[0];
echo $val;
?>
输出 :
25.32
作为一个函数:(更新)
<?php
function getInt($str)
{
preg_match("/([0-9]+[\.,]?)+/",$str,$matches);
return $matches[0];
}
?>
用法 :
<?php
$val = getInt("e.g. 25.32");
?>
如果数字很简单:
([0-9]+(?:\.[0-9]+)?)
然后你想在字符串的末尾匹配这个:
$string = 'e.g. 25.32';
$number = preg_replace('~^.*?([0-9]+(?:\.[0-9]+)?)$~', '$1', $string);
这将使$number
contains "25.32"
,如果您需要 float 值,将其转换为 float :
$float = (float) $number;
此代码仅在实际存在数字时才有效。如果不能确定,请先测试:
$string = 'e.g. 25.32';
$number = NULL;
$hasNumber = preg_match('~([0-9]+(?:\.[0-9]+)?)$~', $string, $matches);
if ($hasNumber)
{
list(, $number) = $matches;
}
如果数字可以是 PHP 中的数字:
([+-]?INF|[+-]?(([0-9]+|([0-9]*[\.][0-9]+)|([0-9]+[\.][0-9]*))|([0-9]+|(([0-9]*[\.][0-9]+)|([0-9]+[\.][0-9]*)))[eE][+-]?[0-9]+))
因此,请注意您实际需要匹配的内容。
我的旧函数也适用于负数:
function getNumber($str){
return floatval(preg_replace('/^[^\d-]+/','',$str));
}