从字符串中提取数字

Biz*_*oss 300 php

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

"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)

  • 数字前的短划线将被视为减号. (54认同)
  • 不仅仅是数字之前.任何+/-都不会被截断.如果你有`xxx-yyy-24`,你会得到`-24`.您可以使用`str_repleace(array('+',' - '),'',$ result)`来删除这两个符号. (42认同)
  • `abs((int)filter_var($ str,FILTER_SANITIZE_NUMBER_INT));` (19认同)
  • @imclickingmaniac你可以简单地使用数组和字符串替换来执行`max(0,filter_var($ str,FILTER_SANITIZE_NUMBER_INT)). (4认同)
  • 使用max()也会返回字符串中的减号,希望strreplace()是这里的选项.谢谢你的提示. (2认同)

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)

  • 这不是一种资源友好的方式.使用`preg_replace("/ [^ 0-9] /","",$ string);`或`filter_var($ str,FILTER_SANITIZE_NUMBER_INT);` (71认同)
  • $ var = implode('',$ matches [0]); (30认同)
  • @eapo`filter_var($ str,FILTER_SANITIZE_NUMBER_INT);`提取的数字,**加**和**减**符号.正则表达式只提取数字! (5认同)
  • @Bizboss 以类似的方式,尝试`$newstr = preg_replace('!\d+!', '', $str);`。它将从您的字符串中删除所有数字。示例:`$str = 'In My Cart : 11 12 items';` 将输出 `In My Cart : items`。 (3认同)
  • 如何在一个简单的变量而不是在Array中获取我的数字? (2认同)

小智 275

preg_replace('/[^0-9]/', '', $string);
Run Code Online (Sandbox Code Playgroud)

这应该做得更好..!

  • 使用这种方法很有用:像'In My Car_Price:`500.00`这样的东西会打印:`50000` (42认同)
  • @ErickBest这是一件好事,考虑到问题是"从字符串中提取数字" - 小数点不是数字! (16认同)
  • preg_replace函数( '/ [^ 0-9.] /', '', 'abc1.22'); //返回小数1.22 (13认同)
  • 我喜欢这个,因为它返回一个字符串,而不是像preg_match_all那样的数组,我喜欢它,因为我只想要数字,而不是加号或破折号,就像filter_var的例子那样. (10认同)
  • 只需使用 `preg_replace('/[^0-9.]/','',$string)` 而不是您想要将 `.` 保留在您的号码中。 (2认同)

Aka*_*eep 77

使用preg_replace:

$str = '(111) 111-1111';
$str = preg_replace('/\D/', '', $str);
echo $str;
Run Code Online (Sandbox Code Playgroud)

输出:1111111111

  • 它工作得很好.它直接将`+387(61)634-783`字符串转换为'38761634783`.您不必像Gaurav的答案那样照顾阵列. (4认同)

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";\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 最快:filter_var\xe2\x80\x94使用指定的过滤器过滤变量

    \n
    var_dump(\n    filter_var($string, FILTER_SANITIZE_NUMBER_INT)\n); // string(2) "11"\n
    Run Code Online (Sandbox Code Playgroud)\n
  2. \n
  3. 几乎最快:str_replace\xe2\x80\x94 用替换字符串替换所有出现的搜索字符串

    \n
    var_dump(\n    str_replace(array(\'In My Cart : \',\' item\', \'s\'),"", $string)\n); // string(2) "11"\n
    Run Code Online (Sandbox Code Playgroud)\n
  4. \n
  5. 足够快:preg_replace\xe2\x80\x94执行正则表达式搜索和替换

    \n
    var_dump(\n    preg_replace("/[^0-9]/","",$string)\n); // string(2) "11"\n
    Run Code Online (Sandbox Code Playgroud)\n
  6. \n
\n

然而

\n
    \n
  • 原因简单,str_replace速度快,但用例也有限
  • \n
  • preg_replace比or更通用str_replacefilter_var
  • \n
  • 相反,可以使用一个函数来指定要替换的内容preg_replace_callback
  • \n
  • withpreg_replace_callback可以在一次调用中进行多次替换
  • \n
  • filter_var卫生设施选择有限
  • \n
\n


mro*_*ice 9

我没有这方面的功劳,但我只需要分享它.这个正则表达式将从一个字符串中获取数字,包括小数点/位数,以及逗号:

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

引用自:
php - regex - 如何从字符串中提取带小数(点和逗号)的数字(例如1,120.01)?


小智 8

使用preg_replace

$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)


mic*_*usa 7

  1. 由于字符串中只有 1 个需要隔离的数值,因此我个人会认可并filter_var()使用FILTER_SANITIZE_NUMBER_INT.

    演示

    var_export(filter_var($string, FILTER_SANITIZE_NUMBER_INT));
    // '11'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 一种更古怪的技术之所以有效,是因为只有 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)
  3. 或者另一种前修剪字符串的方法是使用strpbrk()全数字字符掩码。 此页面专门介绍利用字符掩码的字符串函数,可能会更加清晰。

    演示

    var_export((int) strpbrk($string, '0123456789'));
    // 11
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果由于某种原因有多个整数值并且您想获取第一个整数值,那么正则表达式将是一种直接技术。

    演示

    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)
  5. sscanf()如果您需要显式地将数字字符串转换为整数(或浮点数),则相当方便。如果整数值可能/未知出现在字符串的开头,则在扫描输入字符串之前在其前面添加一个非数字字符。以下技术匹配前导非数字(并*在 后忽略它们%),然后匹配第一个出现的数字序列并将返回的子字符串转换为整数。

    演示

    var_export(sscanf(' ' . $string, '%*[^0-9]%d')[0]);
    // 11
    
    Run Code Online (Sandbox Code Playgroud)

    要采用此技术来提取浮点值,只需将 更改df。有关(当前未记录的)分配抑制功能的更多信息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)

这将只返回数值


Jas*_*een 5

您可以使用以下功能:

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