我有HTML源代码,我必须在HTML中获取一些信息文本。我不能使用DOM,因为文档格式不正确。
也许,来源可能会在以后发生变化,我无法意识到这种情况。因此,对于大多数情况,这个问题的解决方案必须是可行的。
我正在使用curl获取源代码,我将使用preg_match_all函数和正则表达式对其进行编辑。
资料来源:
...
<TR Class="Head1">
<TD width="15%"><font size="12">Name</font></TD>
<TD>: </TD>
<TD align="center"><font color="red">Alex</font></TD>
<TD width="25%"><b>Job</b></TD>
<TD>: </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>: </TD>
<TD align="center"><font color="red">32</font></TD>
<TD width="15%"><font size="10">data</TD></font>
<TD> </B></TD>
<TD width="40%"> </TD>
</TR>
...
正如我们所看到的,来源并不完善。其实太可怕了!但我无能为力。 来源比这长。
如何从源获取数据?我可以删除所有HTML代码,但我怎么知道数据序列?我可以用preg_match_all和regex做什么?我还能做什么?
我在等你的帮助。
答案 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>: </TD>
<TD align="center"><font color="red">32</font></TD>
<TD width="15%"><font size="10">data</TD></font>
<TD> </B></TD>
<TD width="40%"> </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上的所有内容自己的。
或者您可以使用解析器。
答案 3 :(得分:0)
$regex = <<<EOF
<TR Class="Head2">\s+<TD width="15%" align="left">Age</B></TD>\s+<TD>: </TD>\s+<TD align="center"><font color="red">(\d+)</font></TD>\s+<TD width="15%"><font size="10">(\w+)</TD></font>\s+<TD> </B></TD>\s+<TD width="40%"> </TD>\s+</TR>
EOF;
preg_match_all($regex, $text, $result);
var_dump($result)