Php regular expression to match a div

你说的曾经没有我的故事 提交于 2019-12-10 14:23:10

问题


This is 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);

?>

I want find all content in div id='news-id-160346'. Please help me


回答1:


Use an HTML parser. NOT regular expressions.

The problem with regular expressions is that they cannot match nested structures. Assuming your regex must match a single <div> and its closing tag, there is no way to correctly match this input:

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

Because if your regular expression is greedy, it will match the two uppermost divs, and if it's ungreedy, it will not match the correct end tag.

Therefore, you should use an HTML parser. With PHP, DOMDocument::loadHTML or DOMDocument::loadHTMLFile each do a fairly good job. (You may "safely" ignore the warnings it generates: they're only markup errors, and the generated DOMDocument object should be pretty much okay.)

Since the PHP getElementById is a pain to get to work, you can use DOMXpath for the same purpose:

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

?>



回答2:


Use a parser as others suggested.

Or try this regex:

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

Check the output of the print_r statement to understand why regex is not considered as the right tool for parsing html.



来源:https://stackoverflow.com/questions/2947360/php-regular-expression-to-match-a-div

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!