字符串:
lorem ipsum 999
[id:284,286]
[id:28]
括号中的块可能包含很多数字。
正则表达式:
'[id:('d+)(,'d+)*']
我希望看到的:
284
286
28
使用 PHP 的解决方案:
preg_match_all('/'[id:(.*)']/', $input, $ids);
if (strpos($ids[1][0], ',')) {
$ids = explode(',', $ids[1][0]);
foreach ($ids as $id) {
echo $id . "'n";
}
} else {
echo $ids[1][0];
}
但是是否可以使用没有 explode() 的正则表达式?
explode
的方式也许是最好的。不幸的是,PCRE 不记得重复的组,因此,您要么分 2 步(使用 explode
),要么使用基于 'G
的正则表达式。这是一个比你正在使用的正则表达式更安全的正则表达式(如果数字之间没有空格):
$input = "lorem ipsum 999 [id:284,286] [id:28]";
preg_match_all('~'[id:(['d,]*)]~', $input, $ids);
foreach ($ids[1] as $id) {
print_r(explode(',', $id)) . PHP_EOL;
}
查看 IDEONE 演示
'~'[id:(['d,]*)]~'
正则表达式匹配[id:
然后匹配并捕获到组 1 中零个或多个(由于 0+ 出现量词*
)数字 ( 'd
) 或 ,
s。
如果您需要一个正则表达式解决方案,在 PHP 中,如果您处理单个字符串,您可以使用基于 'G
的正则表达式,您可以利用它来设置前导边界,然后匹配连续的数字:
'~(?:'[id:|(?!^)'G,)'K'd+~'
请参阅正则表达式演示和此 IDEONE 演示:
$re = '~(?:'[id:|(?!^)'G,)'K'd+~';
$strs = array("lorem ipsum 999", "[id:284,286]", "[id:28]");
foreach ($strs as $s) {
preg_match_all($re, $s, $matches);
print_r($matches[0]);
}
图案详情:
-
(?:'[id:|(?!^)'G,)
- 将[id:
文字字符序列或每个成功匹配的结尾与后面带有逗号的(?!^)'G
匹配 -
'K
- 省略匹配的值 -
'd+
- 仅匹配 1+ 位数字
如果数字之间可能有空格,请在逗号之后(也许在逗号之前)添加's*
。