请考虑以下字符串:
$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)
如果整数总是在字符串的开头:
(int) $string;
Run Code Online (Sandbox Code Playgroud)
如果不是,那么strpbrk可用于提取第一个非负数:
(int) strpbrk($string, "0123456789");
Run Code Online (Sandbox Code Playgroud)
这些单行基于preg_split、preg_replace和preg_match:
preg_split("/\D+/", "$string ")[1];
(int) preg_replace("/^\D+/", "", $string);
preg_match('/\d+/', "$string 0", $m)[0];
Run Code Online (Sandbox Code Playgroud)
其中两个将额外的字符附加到字符串,因此空字符串或没有数字的字符串不会导致问题。
请注意,这些替代解决方案仅用于提取非负整数。