-2

我想删除一些带有 id 或 class 的 div,其中包含单词commentshare(如:<div id="comment">、、、、)<div class="header-comment">,我使用的东西<div id="comment-footer"><div class="social-share">

preg_replace('/<div[^>]*(comment|share)[^>]*>(.*?)<\/div>/is', '', $htmls);

不行。如何做一个正确的正则表达式?这是一些测试代码,我想删除comment部分并保留contentfooter

$htmls = <<<EOT
<div id="content">
     Main content.
</div>
<div id="comment">
    <ul>
        <li class="comment">
            <div class="header-comment">
                Comment:
                <span class="date-comment">8/11/2012, 21:25</span>
            </div>
            <h4>Some Text</h4>
            <p class="test-comment">Blah~~ Blah~~ Blah~~</p>
            <div class="share">
                <div class="vote">
                    <a class="vota yes" title="Like">2</a>
                    <a class="vota no" title="Unlike">0</a>
                </div>
            </div>
        </li>
        <li class="comment">
            <div class="header-comment">
                Comment:
                <span class="date-comment">8/11/2012, 23:08</span>
            </div>
            <h4>Other Text</h4>
            <p class="test-comment">Blah~~ Blah~~ Blah~~</p>
            <div class="share">
                <div class="vote">
                    <a class="vota yes" title="Like">4</a>
                    <a class="vota no" title="Unlike">0</a>
                </div>
            </div>
        </li>     
     </ul>
</div>
<div id="footer">
     Footer content.
</div>
EOT;

$htmls = preg_replace('/<div[^>]*(comment|share)[^>]*>(.*?)<\/div>/is', '', $htmls);
echo $htmls;
4

4 回答 4

2

考虑使用DOMDocument函数来解析 HTML,然后定位div您不想要的并将其删除。这将更快,更容易理解和维护,并且可能更快地编写。

于 2012-11-09T12:28:43.717 回答
1

我认为你应该使用的是 DomDocument尝试:

$dom = new DOMDocument();
$dom->loadHTML($htmls);
$remove = array("comment","share");
$removeList = array();
foreach ( $dom->getElementsByTagName("div") as $div ) {
    if (in_array($div->getAttribute("class"), $remove) || in_array($div->getAttribute("id"), $remove)) {
        $removeList[] = $div;
    }
}

foreach ( $removeList as $div ) {
    $div->parentNode->removeChild($div);
}

$dom->formatOutput = true;
echo "<pre>";
echo htmlentities($dom->saveHTML());
于 2012-11-09T12:31:21.213 回答
0

如何做一个正确的正则表达式?

为此,您首先识别所有 DIV,提取它们的文本,然后使用preg_match.

但是,您也可以使用正则表达式来保留部分,而只需使用xpath。在您的情况下,这更直接。

于 2012-11-09T12:15:56.827 回答
0

请参阅此站点以测试您的正则表达式 http://www.regexplanet.com/advanced/java/index.html

于 2012-11-09T12:25:09.390 回答