php preg_match_all与正则表达式,字符串解析。多行

时间:2014-10-16 07:19:57

标签: php regex preg-match match

我是新手php程序员。

我严重的问题T_T ....

使用php preg_match_all和regex,

  

$ pattern =" /<<>>(。*){0,20}?(<<>>)/&#34 ;;
  $ text =<<>> id1<<>><<>><<<>> 3<<>>><">> 5<>>> 6 LT;<>大于7<<>&GT 8 LT;>> 9<<>大于10<<>> 11<<>> 12<&LT ;>> 13<<>> 14<<>> 15℃;<>> 16<<>> 17<<>>第18版;<&GT ;&GT 19 LT;<>> 20℃;<>> 21<<>>&#34 ;;
              $ text。="<<>> id2<<>> 2<<>>><>>><>>> 5< <>→6<<>大于7<<>&GT 8 LT;>> 9<<>大于10<<>> 11<<> > 12<<>> 13<<>> 14<<>> 15℃;<>> 16<<>> 17<<>> 18版;<>> 19<<>> 20℃;<>> 21<<>>&#34 ;;
              $ text。="<<>> id3<<>><<>>><>>><>>><> <>→6<<>大于7<<>&GT 8 LT;>> 9<<>大于10<<>> 11<<> > 12<<>> 13<<>> 14<<>> 15℃;<>> 16<<>> 17<<>> 18版;<>> 19<<>> 20℃;<>> 21<<>>&#34 ;;

     

preg_match_all($ pattern,$ text,$ match);

这个结果。

  

阵列(
[0] =>阵列([0] =><<<>>><<<>>><<>>><<<<<<<<<> ;>> 4℃;<>> 5';<>→6<<>大于7<<>&GT 8 LT;>> 9<<>&GT ; 10<<>> 11<<>> 12<<>> 13<<>> 14<<>> 15℃;<>> 16&LT ;<>> 17<<>>第18版;<>> 19<<>> 20℃;<>> 21<<>><&LT ;>> ID2<<>> 2';<>> 3';<>> 4℃;<>> 5';<>→6<<&GT ;大于7<<>&GT 8 LT;>> 9<<>大于10<<>> 11<<>> 12<<>&GT 13 LT ;<>> 14<<>> 15℃;<>> 16<<>> 17<<>>第18版;<>> 19<&LT ;>> 20℃;<>> 21<<>><<>> ID3<<>> 2';<>> 3';<&GT ;> 4℃;<>> 5';<>→6<<>大于7<<>&GT 8 LT;>> 9<<>大于10&LT ;<>> 11<& LT;>> 12<<>> 13<<>> 14<<>> 15℃;<>> 16<<>> 17<< >>第18版;<>> 19<<>> 20℃;<>> 21<<>>           )
  [1] =>排列           (               [0] => ID1<<>> 2';<>> 3';<>> 4℃;<>> 5';<>→6<<>大于7< <>&GT 8 LT;>> 9<<>大于10<<>> 11<<>> 12<<>> 13<<> > 14<<>> 15℃;<>> 16<<>> 17<<>>第18版;<>> 19<<>> 20℃;<>> 21<<>><<>> ID2<<>> 2';<>> 3';<>> 4℃; <>> 5';<>→6<<>大于7<<>&GT 8 LT;>> 9<<>大于10<<> > 11<<>> 12<<>> 13<<>> 14<<>> 15℃;<>> 16<<>> 17<<>>第18版;<>> 19<<>> 20℃;<>> 21<<>><<>> ID3< <>> 2';<>> 3';<>> 4℃;<>> 5';<>→6<<>大于7<< >&GT 8 LT;>> 9<<>大于10<<>> 11<<>> 12<<>> 13<<>> 14 LT;<& GT;> 15℃;<>> 16<<>> 17<<>>第18版;<>> 19<<>> 20℃;<> > 21           )
      [2] =>排列           (               [0] => <<>>           )
  )

然而,我想要结果,在下面。

  

[0] => (

     
    

[0] => ID1
    [1] => 1
    [2] => 2
    ...
    )

  
     

[1] => (

     
    

[0] => ID2
    [1] => 1
    [2] => 2
    ...
    )

  

如何使用正则表达式,这个结果?

EDIT1。

array_filter(preg_split(' /> /',$ text));

  

阵   (       [1] => ID1       [2] => 2       [3] => 3       [4] => 4       [5] =>五       [6] => 6       [7] => 7       [8] => 8       [9] => 9       [10] => 10       [11] => 11       [12] => 12       [13] => 13       [14] => 14       [15] => 15       [16] => 16       [17] => 17       [18] => 18       [19] => 19       [20] => 20       [21] => 21       [23] => ID2       [24] => 2       [25] => 3       [26] => 4       [27] =>五       [28] => 6       [29] => 7       [30] => 8       [31] => 9       [32] => 10       [33] => 11       [34] => 12       [35] => 13       [36] => 14       [37] => 15       [38] => 16       [39] => 17       [40] => 18       [41] => 19       [42] => 20       [43] => 21       [45] => ID3       [46] => 2       [47] => 3       [48] => 4       [49] =>五       [50] => 6       [51] => 7       [52] => 8       [53] => 9       [54] => 10       [55] => 11       [56] => 12       [57] => 13       [58] => 14       [59] => 15       [60] => 16       [61] => 17       [62] => 18       [63] => 19       [64] => 20       [65] => 21   )

但是,我想要

  

[0] => ([0] => id1 [1] => 1 ...)
  [1] => ([0] => id2 [1] => 1 ...)
  [2] => ([0] => id3 [1] => 1 ...)

怎么做?

1 个答案:

答案 0 :(得分:0)

替代方法:爆炸你的字符串

尝试使用explode()函数拆分行,而不是使用正则表达式(速度很慢)。

explode('<<>>', $text);

这将在数组的开头和结尾创建空元素。要摆脱它们,您可以使用array_filter

array_filter(explode('<<>>', $text));

然而,我注意到,在8到9之间,你有<>>(注意缺少<)。如果需要这样,你也需要处理这种输入,你可以使用preg_split,这可以让你做explode同样的事情,但使用&#34;多个&#34 ;分隔符:

array_filter(preg_split('/<?<>>/', $text));

原创方法:preg_match_all

但是,如果您坚持使用preg_match_all,那么您需要注意以下几点:

  1. {0,20}不需要*。即你正在照顾的是.{0,20},而不是.*{0,20}。否则没有意义。
  2. 您可以通过使用非捕获组围绕<<>>来阻止(?:<<>>)出现在结果中:?
  3. 要处理excessive greediness,您可以在{x,y}*+等运营商之后使用preg_match_all('/(.{0,20}?)(?:<?<>>)/', $text, $matches); 运算符。这将使匹配变得懒惰。
  4. 考虑到这一点,我们可以构建以下正则表达式:

    preg_match_all

    这将在数组的开头创建一个空元素。我把它留给你去除它。


    如您所见,使用explode()要比使用preg_split或{{1}}复杂得多。这就是为什么我建议你使用第一种方法。