这个确实比较困难啊。
主要难度在你的大括号的嵌套。
如果你的大括号的嵌套是成对出现的,我倒是有个思路,如果可行,你倒是可以试一下:
1、正则语句:\{[^\{\}]+\}
这句话可以取到最内层的“{...}”,如果没有嵌套就直接取出来了,
比如:广州{南海,顺德,三水},佛山{南海,顺德,三水,{shanghai,{aaaaa,aaaaa}}},
取出了:{南海,顺德,三水}和{aaaaa,aaaaa}
这是可以对取出的这2个替换逗号,然后将大括号替代成其他字符,比如“#”和“$”,然后再次使用正则匹配,这个就是递归了。
2、与上面的类似,不是反其道
正则语句:\}[^\{\}]+{
这句话可以找到“}”“{”之间的不包含“{”“}”的全部数据,也就是说一次性找出大括号外的数据,这种方法不能找出第一个{之前的数据和最后一个}之后的数据,这个很捡到,检索一次就好。将这些数据的逗号替换成其他字符,如“#”,然后将其他的逗号替换成你想要的字符,最后将“#”替换回逗号,结束。
个人感觉两种方法都可行,第二种方法比较简单,不需要递归,仅供参考。
用你的写的匹配出来大括号内所有内容以后,结果中再匹配一次逗号即可。
你的已经是写“对”了的,只不过你没有提取数字而已。改一下模式:'/\(([\s\s]*?)\)/',这样就能利用$matchplayers[1]得到你要的数字了。在模式中,括号有子模式的作用,也就是从左到右,括号引起的数据从1开始到n,在匹配结果中用下标1到n提取。$matchplayers[0]则是总结果。详细参考php手册。