如何使用PHP和RegEx从HTML源代码获取数据?

时间:2011-01-26 23:21:20

标签: php regex preg-match preg-match-all

我有HTML源代码,我必须在HTML中获取一些信息文本。我不能使用DOM,因为文档格式不正确。

也许,来源可能会在以后发生变化,我无法意识到这种情况。因此,对于大多数情况,这个问题的解决方案必须是可行的。

我正在使用curl获取源代码,我将使用preg_match_all函数和正则表达式对其进行编辑。

资料来源:
...
<TR Class="Head1">
<TD width="15%"><font size="12">Name</font></TD>
<TD>:&nbsp;</TD>
<TD align="center"><font color="red">Alex</font></TD>
<TD width="25%"><b>Job</b></TD>
<TD>:&nbsp;</B></TD>
<TD align="center" width="25%"><font color="red">Doctor</font></TD>
</TR>
...
...
<TR Class="Head2">
<TD width="15%" align="left">Age</B></TD>
<TD>:&nbsp;</TD>
<TD align="center"><font color="red">32</font></TD>
<TD width="15%"><font size="10">data</TD></font>
<TD>&nbsp;</B></TD>
<TD width="40%">&nbsp;</TD>
</TR>
...

正如我们所看到的,来源并不完善。其实太可怕了!但我无能为力。 来源比这长。

如何从源获取数据?我可以删除所有HTML代码,但我怎么知道数据序列?我可以用preg_match_all和regex做什么?我还能做什么?

我在等你的帮助。

4 个答案:

答案 0 :(得分:2)

如果你可以使用DOM,这远比正则表达式好。看一下PHP Tidy - 它旨在管理格式错误的HTML。

答案 1 :(得分:1)

您可以使用DOMDocument加载格式错误的HTML:

$doc = new DOMDocument();
@$doc->loadHTML('<TR Class="Head2">
<TD width="15%" align="left">Age</B></TD>
<TD>:&nbsp;</TD>
<TD align="center"><font color="red">32</font></TD>
<TD width="15%"><font size="10">data</TD></font>
<TD>&nbsp;</B></TD>
<TD width="40%">&nbsp;</TD>
</TR>');


$tds = @$doc->getElementsByTagName('td');
foreach ($tds as $td) {
 echo $td->textContent, "\n";
}

为简洁起见,我在上面的代码中压制了警告。

输出:

Age
: 
32
data
  <!-- space -->
  <!-- space -->

使用正则表达式解析HTML可能是徒劳的,因为HTML不是常规语言。

答案 2 :(得分:0)

Don't use RegEx.这个链接很有趣但没有提供信息,所以它的长短不一样就是HTML标记不是常规语言,因此不能简单地使用正则表达式进行解析。

您可以使用RegEx来解析单个“标记”(单个打开标记;单个属性名称或值...)作为递归解析算法的一部分,但是您不能使用魔法RegEx来解析HTML上的所有内容自己的。

或者您可以使用解析器。

由于标记无效,您可以使用TagSoupPHP:Tidy

答案 3 :(得分:0)

$regex = <<<EOF
<TR Class="Head2">\s+<TD width="15%" align="left">Age</B></TD>\s+<TD>:&nbsp;</TD>\s+<TD align="center"><font color="red">(\d+)</font></TD>\s+<TD width="15%"><font size="10">(\w+)</TD></font>\s+<TD>&nbsp;</B></TD>\s+<TD width="40%">&nbsp;</TD>\s+</TR>
EOF;

preg_match_all($regex, $text, $result);

var_dump($result)