我是新手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 ...)
怎么做?
答案 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
,那么您需要注意以下几点:
{0,20}
不需要*
。即你正在照顾的是.{0,20}
,而不是.*{0,20}
。否则没有意义。<<>>
来阻止(?:<<>>)
出现在结果中:?
。{x,y}
,*
和+
等运营商之后使用preg_match_all('/(.{0,20}?)(?:<?<>>)/', $text, $matches);
运算符。这将使匹配变得懒惰。考虑到这一点,我们可以构建以下正则表达式:
preg_match_all
这将在数组的开头创建一个空元素。我把它留给你去除它。
如您所见,使用explode()
要比使用preg_split
或{{1}}复杂得多。这就是为什么我建议你使用第一种方法。