5

これはmycodeです

<?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>

正規表現が貪欲である場合は、最上部の2つの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ステートメントの出力を確認して、html を解析するための適切なツールとして正規表現が考慮されない理由を理解してください。

于 2010-06-01T05:09:58.717 に答える