【问题标题】:PHP regex remove some unwanted divPHP regex 删除一些不需要的 div
【发布时间】:2012-11-09 12:12:01
【问题描述】:

我想删除一些 id 或 class 包含单词 commentshare 的 div(如:<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;

【问题讨论】:

标签: php html regex


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我认为你应该使用DomDocumenttry :

    $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());
    

    【讨论】:

    • 所以如果某些 div 喜欢:div.header-comment,div.social-share,我应该将它们全部列在 $remove = array("comment","share","header-comment","social-share"); 中吗?在数组中列出所有内容太累了。
    • 是否可以使用strpos 代替in_array?如果在 id 或 class 中找到 commentshare,删除 div?
    【解决方案3】:

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

    您通过first identifying all DIVs, extract their texts 执行此操作,然后使用preg_match 查看该文本以查找您的正则表达式模式。

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

    【讨论】:

      【解决方案4】:

      参考这个网站来测试你的正则表达式 http://www.regexplanet.com/advanced/java/index.html

      【讨论】:

        猜你喜欢
        • 2015-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多