使用PHP提取字符串中的第一个整数

时间:2013-03-01 10:16:35

标签: php preg-replace

考虑以下字符串:

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

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

8
8

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

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

有什么建议吗?

8 个答案:

答案 0 :(得分:9)

使用正则表达式的方便(虽然没有破纪录的性能)解决方案是:

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

答案 1 :(得分:7)

preg_match('/\d+/',$id,$matches);
$id=$matches[0];

答案 2 :(得分:3)

如果整数始终位于字符串的开头:

(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];

其中两个在字符串中添加了额外的字符,因此空字符串或没有数字的字符串不会导致问题。

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

答案 3 :(得分: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);

答案 4 :(得分:1)

foreach($strings as $string){
    echo preg_replace("/([0-9]+)\./", "\\1",$string);
}

答案 5 :(得分:1)

foreach($strings as $string){
 if(preg_match("/^(\d+?)/",$string,$res)) {
   echo $res[1].PHP_EOL;
 }
}

答案 6 :(得分:1)

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

目标整数有可能不在字符串的开头(即使OP的问题仅提供了以整数开头的样本,其他研究人员也可能需要更多的效用...例如我的页面今天使用此页面关闭)。输入也可能不包含整数,或者不包含前导/结尾的非数字字符。

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

  1. 它以字符串开头的所有非数字字符为目标-如果有的话,它将立即停在第一个遇到的数字之前。
  2. 它匹配/使用第一个遇到的整数,然后立即匹配(使用void dateIncrement(int& day, int& month, int& year) { ... // this is a void function so remove your return statement } 忘记/释放它,然后匹配/使用其余字符串中遇到的任何字符。

我的代码段将替换0、1或2个替换字符串,具体取决于字符串的质量。

代码:(https://en.cppreference.com/w/cpp/language/operator_other

\K

输出:

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

答案 7 :(得分:0)

如果您在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);

享受吧!最诚挚的问候Ovasapov