正则问题 ,我想得到 全部的数字

长宁楚王陈涉 发布于 2015/06/19 22:57
阅读 206
收藏 0
$str = '123,456,78,90';

$pa = '/([0-9]+(?:.?))*/';
if(preg_match($pa, $str, $match)) {
	println($match);
}

结果:

Array ( [0] => 123,456,78,90 [1] => 90 )
为何只能匹配到 90 ,为何不是 1 => 123, 2=> 456, 3=> 78, 4=> 90 就算不是,那也是 1 => 123

不明白为什么?




加载中
0
终曲
终曲

([0-9]+)(?:[^0-9]?)

是要这样的结果?



长宁楚王陈涉
长宁楚王陈涉
或许我的答案还是有问题的?我再想想
0
长宁楚王陈涉
长宁楚王陈涉

引用来自“终曲”的评论

([0-9]+)(?:[^0-9]?)

是要这样的结果?



你这个结果不对,我是想把里面的数字全部匹配出来,不用preg_match_all 这样的。


ps:好吧,我突然顿悟了,知道为何 preg_match 匹配不了全部了。


matches 如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1]将包含第一个捕获子组匹配到的文本,以此类推。
上面是官方的说明。就是说,$matches[0] 是匹配第一个分组的文本,而我写的表达是,分组文本就一个,所以 匹配的结果数组最多2调数据:$matches[0]是([0-9]+(?:.?))* 匹配出来的结果,$matches[1]即为[0-9]+捕获的结果,而(?:.?)只是捕获,但是不会为其分组,就是说不会显示在结果中。

如果是这样(?:[0-9]+)(.(?:[0-9]+))(?:[0-9]+)(.(?:[0-9]+))(?:[0-9]+)(.(?:[0-9]+))(?:[0-9]+)(.(?:[0-9]+)) 就能够得到,

Array ( 
[0] => 123,456,78,90 
[1] => 123, 
[2] => 456, 
[3] => 78, 
[4] => 90
 )
当然 如果用 preg_match_all() \d+ 是最好的选择
长宁楚王陈涉
长宁楚王陈涉
回复 @终曲 : 我写的正则跟你些的正则是可以完全匹配 https://www.debuggex.com/ 可以测试。但是我却不能完全拿到匹配的内容。应该还是正则的问题。
终曲
终曲
我给的那个正则,遍历group1可以拿到你要的
终曲
终曲
不好意思我不懂php,我只懂正则。。
0
孤单时会想你
孤单时会想你

为什么要用正则 。。split (逗号分隔自动获取数组)

不要为了用正则而用正则

长宁楚王陈涉
长宁楚王陈涉
有时候情况会比这个复杂的多,简单的用split 是解决不了问题
返回顶部
顶部