2

我有一个这样的字符串:

$string = 'e.g. 25.32';

我只想提取数字(25.32)

数字周围的文本可能是任何非数字。

4

4 回答 4

3

你可以使用类似的东西:

<?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");
?>
于 2012-04-14T18:47:01.277 回答
2

如果数字很简单:

([0-9]+(?:\.[0-9]+)?)

然后你想在字符串的末尾匹配这个:

$string = 'e.g. 25.32';
$number = preg_replace('~^.*?([0-9]+(?:\.[0-9]+)?)$~', '$1', $string);

这将使$numbercontains "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]+))

因此,请注意您实际需要匹配的内容。

于 2012-04-14T19:01:54.117 回答
1

如果您使用preg_match知道字符串的格式,则可以使用正则表达式

于 2012-04-14T18:46:46.187 回答
1

我的旧函数也适用于负数:

function getNumber($str){
    return floatval(preg_replace('/^[^\d-]+/','',$str));
}
于 2012-04-14T18:59:04.187 回答