5

这是我的代码

<?php

/**
 * @author Joomlacoders
 * @copyright 2010
 */
    $url="http://urlchecker.net/html/demo.html";

    $innerHtml=file_get_contents($url);

    //echo $innerHtml;
    preg_match_all("{\<div id='news-id-.*d'\>(.*)\</div\>}",$innerHtml,$matches);

          //<div id='news-id-160346'>            

    var_dump($matches);

?>

我想在 div id='news-id-160346' 中找到所有内容。请帮我

4

2 回答 2

6

使用 HTML 解析器。不是正则表达式。

正则表达式的问题在于它们无法匹配嵌套结构。假设您的正则表达式必须匹配单个<div>及其结束标记,则无法正确匹配此输入:

<div id="a">
    <div id="b">
        Foo
    </div>
</div>
<div id="c">
    Bar
</div>

因为如果你的正则表达式是贪婪的,它会匹配最上面的两个div,如果它是非贪婪的,它不会匹配正确的结束标签。

因此,您应该使用 HTML 解析器。用PHP,DOMDocument::loadHTML还是DOMDocument::loadHTMLFile各自做的还算不错。(您可以“安全地”忽略它生成的警告:它们只是标记错误,生成的DOMDocument对象应该没问题。)

由于 PHP getElementById 很难开始工作,因此您可以将 DOMXpath 用于相同目的:

<?php

$url = "http://urlchecker.net/html/demo.html";

$d = new DOMDocument();
$d->loadHTMLFile($url);

$xpath = new DOMXPath($d);
$myNews = $xpath->query('//@id="news-id-160346"')->item(0);

?>
于 2010-06-01T05:02:18.520 回答
0

按照其他人的建议使用解析器。

或者试试这个正则表达式:

preg_match_all("#<div [^>]*id=['\"]news-id-\\d+['\"](.*?)</div>#", $innerHtml, $matches);
print_r($matches);

检查print_r语句的输出以了解为什么 regex 不被视为解析 html 的正确工具。

于 2010-06-01T05:09:58.717 回答