如何找到一个块并在其中迭代

时间:2011-05-27 09:05:32

标签: regex

我正在尝试实现一个基本上会提取ELEMENTS行中所有元素的正则表达式。

说我有这个html字符串:

<tr> <td> ELEMENTS</td> <td> <element>A1</element> , <element>A2</element> </td></tr><tr> <td> MORE_ELEMENTS</td> <td><element> A3</element>, <element> A4</element>, <element> A5</element> </td></tr>

我想提取ELEMENT行(A1A2A3)中的所有元素,但不要提取MORE_ELEMENTS行中的元素( A4A5A6)。

使用此正则表达式,您可以匹配所有元素:

<element>([^<]+)<\/element>\s*,*\s*

但是,如果我尝试使用此正则表达式限制为ELEMENT S:

<td>\s*ELEMENTS.*?<element>([^<]+)<\/element>\s*,*\s*

我只匹配第一个元素。我不知道如何匹配ELEMENTS行然后迭代 在其中提取所有元素。

也试过这个,但也没办法:

<td>\s*ELEMENTS.*?<element>([^<]+)<\/element>\s*,*\s*(<element>([^<]+)<\/element>\s*,*\s*)*

有什么想法吗?非常感谢提前!

Migsy

2 个答案:

答案 0 :(得分:1)

$test = '<tr> <td> ELEMENTS</td> <td> <element>A1</element> , <element>A2</element> </td></tr><tr> <td> MORE_ELEMENTS</td> <td><element> A3</element>, <element> A4</element>, <element> A5</element> </td></tr>';

    preg_match_all ('~<element>([^<]*)</element>~', $test, $match);

    foreach ($match [1] as $value)
    {
            // do what you inteded
    }

http://php.net/manual/en/function.preg-match-all.php

答案 1 :(得分:0)

使用正则表达式解析html或xml通常被认为是个坏主意。它在一般情况下不起作用,但如果您了解其局限性,则适用于特定情况。

但是,仅仅因为你想使用正则表达式,就没有理由坚持使用正则表达式 。对于此问题,使用正则表达式提取块,然后在结果上使用另一个表达式或函数。你没有赢得任何奖励积分尽可能多地填写表达式。相反,编写可读代码比编写“聪明”代码更好。

当您需要有人为您编写表达式时尤其如此。如果您不理解足以解决问题的正则表达式,那么可以通过寻找其他解决方案或将一个大型复杂模式分解为几个更小,更易于理解的模式来尽可能地限制表达式的复杂性。