0

重複の可能性:
PHP で HTML を解析および処理する方法は?

この質問の言い方がわかりませんでした。

基本的に、私はこのphpコードを持っています:

$new_html = preg_replace('!<div.*?id="spotlight".*?>.*?</div>!is', '', $html);

これでhtmlコードを次のように変更したい(例、実際のhtmlではない):

<div id="container">
    <div id="spotlight">
        <!-- empty -->
    </div>
    <div id="content">
        <!-- lots of content -->
    </div>
</div>

これに:

<div id="container">
    <div id="content">
        <!-- lots of content -->
    </div>
</div>

ご覧のとおり、正規表現は次のものを探しているため、php コードはこれを正常に実行します。

<div{anything}id="spotlight"{anything}>{anything}</div>

でも

div id="spotlight" に次のような子 div が含まれている場合:

<div id="container">
    <div id="spotlight">
        <div></div>
    </div>
    <div id="content">
        <!-- lots of content -->
    </div>
</div>

正規表現は、子 div の終了 div タグと一致します!

どうすればこれを防ぐことができますか? 別のdivが開かれている場合、閉じるdivを無視するように正規表現に指示するにはどうすればよいですか?

ありがとう

4

2 に答える 2

2

使用DOMDocument:

$html = '<div id="container">
    <div id="spotlight">
        <!-- empty -->
    </div>
    <div id="content">
        <!-- lots of content -->
    </div>
</div>';

$dom = new DOMDocument;
$dom->loadXML($html);

$xpath = new DOMXPath($dom);
$query = '//div[@id="spotlight"]';
$entries = $xpath->query($query);

foreach($entries as $one){

    $one->parentNode->removeChild($one);
}

echo $dom->saveHTML();

コードパッドの例

于 2012-09-24T12:31:17.187 に答える
0
$a = preg_replace('/<div[^>]+>\\s+<\/div>/', '', $a);
于 2012-09-24T12:34:44.747 に答える