正则表达式解析由数字和冒号分隔的字符串

时间:2015-03-26 14:43:45

标签: php regex

我试图解析像这样的字符串

  

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解决方案感兴趣

2 个答案:

答案 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

eval.in