【问题标题】:How Can I Get Data From HTML Source Code with PHP and RegEx?如何使用 PHP 和 RegEx 从 HTML 源代码中获取数据?
【发布时间】:2011-01-26 23:21:19
【问题描述】:

我有 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 和正则表达式做什么?我还能做什么?

我在等你的帮助。

【问题讨论】:

  • 你试过用DOM吗?您可以使用 @ 抑制错误,即使格式不正确,它仍然可以工作

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


【解决方案1】:

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

【讨论】:

  • +1 - 当我记得 TagSoup 是在 Java 中(这个问题是在 PHP 中)时,我将 PHP Tidy 添加到我的答案中,但你首先在答案中找到了它。
【解决方案2】:

您可以使用 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 不是常规语言。

【讨论】:

  • 正如你所说,我认为正则表达式对此没有用。非良构的 html 文档可以被 Tidy 和 DOM 处理,也可以只被 SimpleHTMLDom 处理。
【解决方案3】:

Don't use RegEx.这个链接很有趣,但信息量不大,所以总而言之,HTML标记不是正则语言,因此不能简单地使用正则表达式进行解析。

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

或者你可以使用解析器。

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

【讨论】:

  • 好的,TagSoup 和 Tidy 是默认安装在服务器上的吗?
  • 我没有这样的印象;事实上,TagSoup 是一个 Java 工具(我的错!)虽然 tidy 显然是 bundled with PHP
  • 非格式良好的 html 文档可以通过 Tidy 转换为格式良好的 html,然后 DOMDocument 可以使用。谢谢大家。
【解决方案4】:
$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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 2011-05-14
    • 2014-11-25
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多