5

考虑以下字符串:

$strings = array(
    "8.-10. stage",
    "8. stage"
);

我想提取每个字符串的第一个整数,所以它会返回

8
8

我试图用 preg_replace 过滤掉数字,但它返回所有整数,我只想要第一个。

foreach($strings as $string)
{
    echo preg_replace("/[^0-9]/", '',$string);
}

有什么建议么?

4

8 回答 8

22

使用正则表达式的一个方便(尽管在性能上不是破纪录的)解决方案是:

$string = "3rd time's a charm";

$filteredNumbers = array_filter(preg_split("/\D+/", $string));
$firstOccurence = reset($filteredNumbers);
echo $firstOccurence; // 3

假设输入中至少有一个数字,这将打印第一个数字。

非数字字符将被完全忽略,除了它们被视为分隔数字之外,这意味着第一个数字可以出现在输入中的任何位置(不一定在开头)。

如果您只想考虑出现在字符串开头的数字,则不需要正则表达式:

echo substr($string, 0, strspn($string, "0123456789"));
于 2013-03-01T10:19:58.753 回答
9
preg_match('/\d+/',$id,$matches);
$id=$matches[0];
于 2015-06-09T06:30:32.217 回答
8

如果整数总是在字符串的开头:

(int) $string;

如果不是,则strpbrk可用于提取第一个非负数:

(int) strpbrk($string, "0123456789");

备择方案

这些单行代码基于preg_splitpreg_replacepreg_match

preg_split("/\D+/", "$string ")[1];
(int) preg_replace("/^\D+/", "", $string);
preg_match('/\d+/', "$string 0", $m)[0];

其中两个将额外的字符附加到字符串中,因此空字符串或没有数字的字符串不会引起问题。

请注意,这些替代解决方案仅用于提取非负整数。

于 2016-02-08T22:26:41.637 回答
2

试试这个:

$strings = array(
    "8.-10. stage",
    "8. stage"
);

$res   = array();
foreach($strings as $key=>$string){
  preg_match('/^(?P<number>\d)/',$string,$match);
  $res[$key] = $match['number'];
}

echo "<pre>";
print_r($res);
于 2013-03-01T10:19:45.277 回答
1
foreach($strings as $string){
    echo preg_replace("/([0-9]+)\./", "\\1",$string);
}
于 2013-03-01T10:20:06.157 回答
1
foreach($strings as $string){
 if(preg_match("/^(\d+?)/",$string,$res)) {
   echo $res[1].PHP_EOL;
 }
}
于 2013-03-01T10:20:24.023 回答
1

如果您在 PHP 7 + 中有通知

注意:只有变量应该在第 LINE_NUMBER 行的 YOUR_DIRECTORY_FILE.php 中通过引用传递

通过使用此代码

echo reset(array_filter(preg_split("/\D+/", $string)));

将代码更改为

$var = array_filter(preg_split("/\D+/", $string));
return reset($var);

享受!最好的问候奥瓦萨波夫

于 2017-07-04T12:20:48.463 回答
1

如何过滤除第一个出现的整数以外的所有字符:

目标整数可能不在字符串的开头(即使 OP 的问题仅提供以整数开头的样本 - 其他研究人员可能需要更多实用程序......就像我今天关闭的页面使用这一页)。输入也可能不包含整数,或者没有前导/没有尾随非数字字符。

下面是一个正则表达式有两个检查:

  1. 它以字符串开头的所有非数字字符为目标——如果有的话,它会在第一个遇到的数字之前立即停止。
  2. 它匹配/消耗第一个遇到的整个整数,然后\K在匹配/消耗字符串其余部分中的任何遇到的字符之前立即忘记/释放它(使用)。

我的代码片段将根据字符串的质量进行 0、1 或 2 次替换。

代码:(演示

$strings = [
    'stage', // expect empty string
    '8.-10. stage', // expect 8
    '8. stage', // expect 8
    '8.-10. stage 1st', // expect 8
    'Test 8. stage 2020', // expect 8
    'Test 8.-10. stage - 2020 test', // expect 8
    'A1B2C3D4D5E6F7G8', // expect 1
    '1000', // expect 1000
    'Test 2020', // expect 2020
];

var_export(
    preg_replace('/^\D+|\d+\K.*/', '', $strings)
);

输出:

array (
  0 => '',
  1 => '8',
  2 => '8',
  3 => '8',
  4 => '8',
  5 => '8',
  6 => '1',
  7 => '1000',
  8 => '2020',
)
于 2020-02-18T23:03:00.293 回答