如何从PHP字符串中仅提取数字?

13

假设我有这个字符串:

$string = "Hello! 123 How Are You? 456";

我想将变量$int设置为$int = 123456;

我该怎么做呢?

例子2:

$string = "12,456";

必填项:

$num = 12456;

谢谢!


3
$int = preg_replace('/\D+/', '', $string); 的翻译是:使用正则表达式替换 $string 中所有非数字字符为 '',并将结果赋值给 $int - Amal Murali
可能是从字符串中提取数字的重复问题。 - Amal Murali
这不是那个问题的重复,那个问题是关于获取所有/任何数字组。 - user2864740
这里是解决方案- https://dev59.com/QGgu5IYBdhLWcg3wj3v5 - Mandeep Singh
5个回答

38

正确的变体将是:

$string = "Hello! 123 How Are You? 456";
$int = intval(preg_replace('/[^0-9]+/', '', $string), 10);

1
现在你可以检查一下你的代码中是否有字符串"hello 0123"... :) - Bangash
@ArifHussain 是的,它适用于0123并提供预期的正确十进制数字123。 - Iłya Bursov
@Lashane,那么在这种情况下,你评论过的Shankar的代码也是正确的。 - Bangash
这段代码会使大数字格式不正确,例如 abc12345678901234556782312312323123123131232 - Mike Doe
1
@mike,PHP本身无法处理如此大的数字,你需要使用特殊的库来实现。 - Iłya Bursov

4
您可以使用此方法仅选择文本中存在的数字。
function returnDecimal($text) {
    $tmp = "";  
    for($text as $key => $val) {
      if($val >= 0 && $val <= 9){
         $tmp .= $val
      }
    }
    return $tmp;
}

低效且缓慢。 - Mike Doe

2
您可以使用以下内容:
$array = [];

preg_match_all('/-?\d+(?:\.\d+)?+/', $string, $array);

在这里,$string代表输入的字符串,$array是每个数字(不仅限于正数,还包括负数!)被加载并可用于不同的操作。


2

使用这个正则表达式 !\d!

<?php
$string = "Hello! 123 How Are You? 456";
preg_match_all('!\d!', $string, $matches);
echo (int)implode('',$matches[0]);

enter image description here


数字前面不需要加 0 - Shankar Narayana Damodaran
Shankar,我认为Lashane的意思是,如果以0为前缀,(int)将把它转换为八进制。或者我完全错了? - Helpful
1
@Helpful 你是对的,你不能在php中只使用(int)将字符串转换为数字。 - Iłya Bursov
1
@Lashane,你没有理解,正则表达式从字符串中获取数字,并将其转换为int类型不会使它成为八进制。 - Shankar Narayana Damodaran
1
@ShankarDamodaran 是的,我在 JavaScript 中犯了错误,其中以 0 为前缀的数字将被视为八进制数。 - Iłya Bursov

-1
<?php
    $string = "ABC100";
    preg_match_all('!\d+!', $string, $matches);
    $number = $matches[0][0];
    echo $number;
?>

输出: 100


1
这种只提供代码的回答对该页面或者 Stack Overflow 没有新的价值。请在您有独特且有价值的内容要添加到页面时再进行回答。更糟糕的是,它只显示了所有匹配项中的第一个。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接