PHP preg_match_all嵌套得太深了

时间:2012-05-12 06:46:43

标签: php regex multidimensional-array nested preg-match-all

我在这里发现了一个类似的问题,但并不完全符合我的情况。 我对PHP比较陌生,但已经阅读了* preg_match_all *。

的手册

我正在解析页面以查找日期。它始终采用相同的格式(例如 2012年4月13日)。 这是我的* preg_match_all *声明:

$eventDateRegex = '/[0-9]{2}\s[A-Z]{1}[a-z]{2}\s[0-9]{4}/';
preg_match_all($eventDateRegex, $parsedEvent, $eventDates[$i]);

$ i 只是一个迭代器,因为它位于 for 循环中。 我在 $ eventDates 中收到了正确的结果,但是,它似乎嵌套了一层太深。

我的结果是这样的:

array
  0 => 
    array
      0 => 
        array
          0 => string '19 Apr 2012' (length=11)
          1 => string '24 May 2012' (length=11)
  1 => 
    array
      0 => 
        array
          0 => string '21 Apr 2012' (length=11)
          1 => string '30 Jun 2012' (length=11)

而我更喜欢它:

array
  0 => 
    array
      0 => string '19 Apr 2012' (length=11)
      1 => string '24 May 2012' (length=11)
  1 => 
    array
      0 => string '21 Apr 2012' (length=11)
      1 => string '30 Jun 2012' (length=11)

这是可能的还是只是因为* preg_match_all *吐出多维数组的方式?

3 个答案:

答案 0 :(得分:1)

您将以所需的格式获得结果。 EventDates数组中的第一级索引是由for-loop和您使用索引$ i生成的。例如,数组中的第一个元素

array
  0 => 
    array
      0 => 
        array
          0 => string '19 Apr 2012' (length=11)
          1 => string '24 May 2012' (length=11)

是正确的数组结构

array
          0 => 
            array
              0 => string '19 Apr 2012' (length=11)
              1 => string '24 May 2012' (length=11)

但在eventDates中的位置0,因为你将$ eventDates [0]作为匹配数组传递给preg函数。

答案 1 :(得分:0)

如果您愿意,可以重新构建数组。

$arr = array(
            array(
                array('19 Apr 2012', '24 May 2012')
                ),
            array(
                array('21 Apr 2012', '30 Jun 2012')
                )
            );

for ($i = 0; $i < count($arr); $i++)
    $arr[$i] = $arr[$i][0];

var_dump($arr);

你会得到

array
  0 => 
    array
      0 => string '19 Apr 2012' (length=11)
      1 => string '24 May 2012' (length=11)
  1 => 
    array
      0 => string '21 Apr 2012' (length=11)
      1 => string '30 Jun 2012' (length=11)

答案 2 :(得分:0)

您可以使用T-Regx,它从不返回一个数组数组

$eventDateRegex = '\d{2} [A-Z][a-z]{2} \d{4}';
$eventDates[$i] = pattern($eventDateRegex)->match($parsedEvent)->all();

这将返回:

[
   ['19 Apr 2012', '24 May 2012']    // first $i
   ['21 Apr 2012', '30 Jun 2012']    // second $i
]

PS:请注意,感谢T-Regx-$eventDateRegex没有/分隔符。