preg_match_all无法使用html标记

时间:2015-08-22 12:26:00

标签: php regex preg-match-all

我正在尝试从this page收到<tbody>代码的内容。

只有一个表只有一个标记<tbody>,我想从此表中获取所有行

我试着通过这种方式做到这一点

$page = file_get_contents('http://pk.zntu.edu.ua/fakultety-ta-napryamy-pidhotovky/derzhavne-zamovlennya-2011-bakalavr');

preg_match_all("/<tbody>(.+?)<\/tbody>/is", $page, $output_array);

var_dump($output_array);

我收到空数组:

array(2) { [0]=> array(0) { } [1]=> array(0) { } }

我尝试了不同的模式变体,比如

  • &#34; /<tbody>(.*?)<\/tbody>/is&#34;
  • &#34; /<tbody>.+?<\/tbody>/is&#34;
  • &#34; /<tbody>.*?<\/tbody>/is&#34;
  • &#34; /<tbody>.+<\/tbody>/is&#34;
  • &#34; /<tbody>.*<\/tbody>/is&#34;

但没有人工作

PCRE和Regex Library都应该没问题

我不知道问题是什么,请帮忙

2 个答案:

答案 0 :(得分:0)

你的模式非常简单,上面的regex应该没问题。但我认为问题来自file_get_contents。我只是尝试计算$page变量中的行数,我得到了这个

71220

但是我通过点击该网站并复制源代码来检查的真实代码然后手动计算,它是关于1787行的。

这是什么意思?

这可能意味着您在$page变量中存储的代码与手动单击该网站时看到的HTML代码不同。实际上,当您打开一个网站时,可能会发生很多事情,例如侦听器方法正在工作,但是如果您将这些源代码直接下载到PHP变量,某些方法可能永远不会执行,这会使您获得不完整的HTML代码。

请注意,支持我的假设的另一个证据是,我甚至无法在tbody变量中找到关键字$page

答案 1 :(得分:-1)

tbody标记也可能包含属性。因此,您还需要按顺序匹配这些属性,以获取tbody标记的内容。

'/<tbody\b[^>]*>(.*?)<\/tbody>/is'