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

fri*_*igg 2 php preg-replace

请考虑以下字符串:

$strings = array(
    "8.-10. stage",
    "8. stage"
);
Run Code Online (Sandbox Code Playgroud)

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

8
8
Run Code Online (Sandbox Code Playgroud)

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

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

有什么建议?

Jon*_*Jon 11

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

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

$filteredNumbers = array_filter(preg_split("/\D+/", $string));
$firstOccurence = reset($filteredNumbers);
echo $firstOccurence; // 3
Run Code Online (Sandbox Code Playgroud)

假设输入中至少有一个数字,则打印第一个数字.

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

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

echo substr($string, 0, strspn($string, "0123456789"));
Run Code Online (Sandbox Code Playgroud)


MER*_*ĞAN 7

preg_match('/\d+/',$id,$matches);
$id=$matches[0];
Run Code Online (Sandbox Code Playgroud)


tri*_*cot 7

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

(int) $string;
Run Code Online (Sandbox Code Playgroud)

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

(int) strpbrk($string, "0123456789");
Run Code Online (Sandbox Code Playgroud)

备择方案

这些单行基于preg_splitpreg_replacepreg_match

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

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

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