考虑以下字符串:
$strings = array(
"8.-10. stage",
"8. stage"
);
我想提取每个字符串的第一个整数,因此它将返回
8
8
我试图用preg_replace过滤掉数字,但它返回所有整数,我只想要第一个。
foreach($strings as $string)
{
echo preg_replace("/[^0-9]/", '',$string);
}
有什么建议吗?
使用正则表达式的一种方便(虽然性能不会破纪录)的解决方案是:
$string = "3rd time's a charm";
$filteredNumbers = array_filter(preg_split("/'D+/", $string));
$firstOccurence = reset($filteredNumbers);
echo $firstOccurence; // 3
假设输入中至少有一个数字,这将打印第一个。
非数字字符将被完全忽略,除了它们被认为是分隔数字的事实,这意味着第一个数字可以出现在输入中的任何位置(不一定在开始)。
如果您只想考虑出现在字符串开头的数字,则不需要使用regex:
echo substr($string, 0, strspn($string, "0123456789"));
preg_match('/'d+/',$id,$matches);
$id=$matches[0];
如果整数总是在字符串的开头:
(int) $string;
如果不是,那么strpbrk用于提取第一个非负数:
(int) strpbrk($string, "0123456789");
替代这些一行程序基于preg_split、preg_replace和preg_match:
preg_split("/'D+/", " $string")[1];
(int) preg_replace("/^'D+/", "", $string);
preg_match('/'d+/', "$string 0", $m)[0];
其中两种会在字符串中附加额外的字符,因此空字符串或没有数字的字符串不会产生问题。
请注意,这些替代解决方案仅用于提取非负整数。
试试这个:
$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);
foreach($strings as $string){
if(preg_match("/^('d+?)/",$string,$res)) {
echo $res[1].PHP_EOL;
}
}
注意:只有变量应该通过在YOUR_DIRECTORY_FILE.php中LINE_NUMBER
行的引用来传递
使用以下代码
echo reset(array_filter(preg_split("/'D+/", $string)));
将代码改为
$var = array_filter(preg_split("/'D+/", $string));
return reset($var);
和享受!问候Ovasapov
如何过滤除第一个出现的整数以外的所有字符:
目标整数可能不在字符串的开头(即使OP的问题只提供以整数开头的样本)——其他研究人员可能需要更多的效用……比如我今天用这个页面关闭的页面)。输入也可能不包含整数,或者不包含前导/尾随非数字字符。
以下是一个正则表达式有两个检查:
- 它针对从字符串开头开始的所有非数字字符——它在遇到第一个数字之前立即停止,如果有的话。
- 它匹配/消耗第一个遇到的整数,然后在匹配/消耗字符串剩余部分中遇到的任何字符之前立即忘记/释放它(使用
'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)
);
或(演示):
preg_replace('/^'D*('d+).*/', '$1', $strings)
输出:array (
0 => '',
1 => '8',
2 => '8',
3 => '8',
4 => '8',
5 => '8',
6 => '1',
7 => '1000',
8 => '2020',
)