在PHP中从HTML中提取一段数据的最简单方法是什么?

时间:2011-02-08 14:59:48

标签: php html regex

我正在使用一小部分无效的HTML,我需要提取一小段数据。鉴于大多数“标记”无效,我不认为将所有内容加载到DOM中是一个不错的选择。而且,对于这个简单的案例来说,这似乎是一个很大的开销。

以下是我所拥有的标记示例:

(a bunch of invalid markup here with unclosed tags, etc.)
<TD><span>Something (random text here)</span></TD>
(a bunch more invalid markup here with more unclosed tags.)

<TD><span>Something (random text here)</span></TD>部分在文档的任何地方都不会重复,所以我相信一个简单的正则表达式可以解决问题。

然而,我对正则表达式很糟糕。

我应该使用正则表达式吗?有更简单的方法吗?如果可能的话,我只想在Something(这里是随机文本)部分之后提取文本。

提前致谢!

编辑 -

HTML的确切示例(我省略了之前的内容,这是供应商使用的无效标记。我相信这与此示例无关):

<div class="FormTable">
        <TABLE>
        <TR>
                <TD colspan="2">In order to proceed with login operation please 
                answer on the security question below</TD>
        </TR>
        <TR>
                <TD colspan="2">&nbsp;</TD>
        </TR>
        <TR>
                <TD><label class="FormLabel">Security Question</label></TD>
                <TD><span>What is your city of birth?</span></TD>
        </TR>
        <TR>
                <TD><label class="FormLabel">Answer</label></TD>
                <TD><INPUT name="securityAnswer" class="input" type="password" value=""></TD>
        </TR>
        </TABLE>
</div>  

4 个答案:

答案 0 :(得分:2)

如果您确定开始和结束范围标记在一行上。 。

$ cat test.php
<?php
  $subject = "(a bunch of invalid markup here with unclosed tags, etc.)
              <TD><span>Something (random text here)</span></TD>
              (a bunch more invalid markup here with more unclosed tags.)";

  $pattern = '/<span>.*<\/span>/';

  preg_match($pattern, $subject, $matches);
  print_r($matches);

?>


$ php -f test.php
Array
(
    [0] => <span>Something (random text here)</span>
)

如果您不确定span标记位于同一行,则可以将html视为文本文件,并将grep视为span标记。

$ grep '[</]span>' yourfile.html

答案 1 :(得分:1)

您可以阅读this answer以及其他两个引用的内容。一次处理无效 HTML实际上是使用正则表达式比使用完整解析器更容易获得运气的好处。

答案 2 :(得分:1)

在您的情况下,使用DOM解析器并不是最佳选择。我坚信您需要SAX解析器,它只是提取文档的一部分并将相应的事件发送给您的处理程序。此方法允许轻松解析损坏的文档。

实施例: http://pear.php.net/package/XML_HTMLSax3 http://www.php.net/manual/en/example.xml-structure.php

答案 3 :(得分:0)

尝试使用DOMDOcument::loadHTML()方法,它应该禁止与HTML相关的任何验证错误。