【问题标题】:Parse HTML DOM using PHP使用 PHP 解析 HTML DOM
【发布时间】:2011-04-15 23:16:55
【问题描述】:

我有这个 html 代码:

<marquee  align="left" id="LatestNewsM" SCROLLAMOUNT="4" loop="infinite" direction="right">

            <font dir="rtl" valign="top" class="StringTheme" style="font-size:14px;">test test test</font>  
            <img src="/Portal/images/LightVersionWeb2/jazeeraTicSep.gif" align="middle">

            <font dir="rtl" valign="top" class="StringTheme" style="font-size:14px;">test sample text sample</font>  
            <img src="/Portal/images/LightVersionWeb2/jazeeraTicSep.gif" align="middle">

            <font dir="rtl" valign="top" class="StringTheme" style="font-size:14px;">text text 222 another text</font>  
            <img src="/Portal/images/LightVersionWeb2/jazeeraTicSep.gif" align="middle">
            ...........
            .....
</marquee>

还有这个 PHP 代码:

$homepage = file_get_contents('http://www.site.com');

如何在内容中搜索并仅获取字体标签 &lt;font&gt; 中的文本

【问题讨论】:

  • 你的问题与file_get_contents()完全无关;我已经相应地对其进行了编辑。除此之外.. DOM 解析器是要走的路 - 请不要考虑使用正则表达式。
  • &lt;marquee&gt;&lt;font&gt;?! 告诉我你只是从一个有几十年历史的网站上抓取数据,以便将其更新为现代标准......
  • @jnpcl:不,我正在尝试从新闻网站获取新闻并将其显示在我的网页上,这就是我想做的全部
  • 你应该给那个网站的HTML代码负责人发一封白粉信。 ;x

标签: php dom


【解决方案1】:

你有几个选择,ThiefMaster 提到的一个是不使用“正则表达式”,使用 strpos 和 substr 或使用 DOM/XML 解析器。

如果你使用正则表达式,你可能会得到这样的结果:

/<font[^>]*>.*<\/font>/i

在这样的数据上运行时:

> Hello, this is my brutal <font>font
> <font>tag</font> right</font> it is

你最终会得到(如果贪婪)

<font>font <font>tag</font> right</font>

或者如果不贪心

<font>font <font>tag</font>

您可以使用否定的前瞻性并做得更好,但这仍然不是一个好的解决方案(这个例子是为了向您展示为什么,正则表达式尽可能简单)

如果你使用strpos和substr,你必须一个一个地查看所有字符并自己解析文档(匹配开始和结束标签,跳过属性)或者你可以尝试

$opening = strpos($dataset, '<font', $closing) // closing is at offset zero
$closing = strpos($dataset, '</font', $opening) // start at opening tag

以此类推,直到您全部解析完为止。

如果您使用 DOM/XML 解析器,您可能需要考虑这一点,使用 file_get_contents 或 file() 将整个文件加载到内存中,就像大多数 DOM/XML 解析器一样,我会使用 XMLReader(流式传输而不是加载整个文件在内存中,解析它,构建树),效率更高。

附言这里已经很晚了(凌晨 3:00),如有拼写错误,请见谅。谢谢你。 :)

【讨论】:

    【解决方案2】:

    将很有用:
    http://php.net/manual/en/function.strip-tags.php - 从文本中删除所有标签
    http://php.net/manual/en/book.simplexml.php - 解析 XML

    如果 HTML 将是有效的(目前不是 - 'img' 标签未关闭),可以使用这样的东西:

    $xml = new SimpleXMLElement($data);
    $fonts = $xml->xpath('/marquee/font');
    foreach ($fonts as $font) print $font[0].PHP_EOL;
    

    【讨论】:

    • 感谢您帮助我,但我收到一个错误,因为第一行是 'DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' 和字符串可以解析不出来,怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2015-08-25
    • 1970-01-01
    • 2019-12-28
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多