我试图解析像这样的字符串
1:Tous les 6 mois2:每6个月4:Tutti i 6 mesi3:Cada 6 meses
进入像这样的数组
array (
0 =>
array (
0 => '1:Tous les 6 mois',
1 => '1',
2 => 'Tous les 6 mois',
),
1 =>
array (
0 => '2:Every 6 months',
1 => '2',
2 => 'Every 6 months',
),
2 =>
array (
0 => '4:Tutti i 6 mesi',
1 => '4',
2 => 'Tutti i 6 mesi',
),
3 =>
array (
0 => '3:Cada 6 meses',
1 => '3',
2 => 'Cada 6 meses',
),
)
我试过这个
preg_match_all('/(\d+):([^\b(\d:)]+)/', $string, $matches, PREG_SET_ORDER);
但是它会在第一个数字处停止捕获。括号被解释为字符
另一种选择是使用
preg_split('/(\d):/', $string, -1, PREG_SPLIT_DELIM_CAPTURE)
但我真的对preg_match_all解决方案感兴趣
答案 0 :(得分:3)
你可以像这样使用积极向前看
preg_match_all('/(\d+):(.*?)(?=\d+:|$)/', $str, $matches, PREG_SET_ORDER);
前瞻(?=\d+:|$)
表示只要数字和冒号或字符串末尾存在,就匹配前一个标记。
答案 1 :(得分:2)
您可以使用基于前瞻性的正则表达式:
preg_match_all('/(\d+):((?:(?!\d:).)*)/', $str, $matches, PREG_SET_ORDER);
注意:您不能在字符类中放置单词边界\b
。