1

我在这里有一个正则表达式查询来提取页面中的所有标签。它看起来像这样:

preg_match_all('%<tr[^>]++>(.*?)</tr>%s', $pageText, $rows);

问题在于,虽然它确实在返回数组中找到了页面上的所有标签,但它实际上返回了一个多维数组,其中第一个数组的每个条目都包含一个包含所有匹配项的数组。换句话说,它给了我第一个数组的多个相同副本,即我真正想要的那个。

请帮忙?

编辑:也相关:我不允许在这个应用程序中使用 DOM,尽管它是一种更容易(和更好)的处理方式。

4

2 回答 2

0

试试这个:

preg_match_all('~<tr(?:\\s+[^>]*)?>(.*?)</tr>~si', $pageText, $rows);
var_dump($rows[1]);

不要使用 % 来包装正则表达式。printf()它是一个为类似功能保留的字符,并且在 Pattern 的末尾%s或结尾处,它可能会非常令人困惑。%i

于 2012-10-29T03:30:40.867 回答
0

您实际上要问的是$row[0]列表,它再次冗余地包含<tr>...</tr>blob。如果您只关心(.*?)内部数据,则使用\K重置完整匹配。

preg_match_all('=<tr\b[^>]*+>(.*?)</tr>\K=s', $pageText, $rows);

完全摆脱是不可能的$row[0]。您将不得不忽略它,并$row[1]单独使用它。

于 2012-10-29T03:35:43.660 回答