2016-04-29 2 views
0

コンテンツのブロックから1つの特定のdiv(およびその内容)を取り除こうとしていますが、それはあまり効果がありません。Regexで1つのdivをコンテンツから外します

正規表現:

/<div class="greybackground_desktop".*>(.*)<\/div>/s 

にpreg_replace:

preg_replace($pattern, "", $holder, -1, $count); 

さて、正規表現は確かに他の以下の終値のdivタグが存在する場合しかし、それはそれらを取り除くでしょう、私のdiv要素を取り除くんその中の他のコンテンツも含まれます。

<p>some random text</p> 

<div class="greybackground_desktop" style="background-color:#EFEFEF;"> 
<!-- /49527960/CSF_Article_Middle --> 
<div style="padding-bottom:10px; padding-top: 10px; text-align:center;" id='div-gpt-ad-1441883689230-0'> 
<script type='text/javascript'> 
googletag.cmd.push(function() { googletag.display('div-gpt-ad-1441883689230-0'); }); 
</script> 
</div> 
</div> 

<p>some more text</p> 

<div><p>example of content that will be incorrectly removed</p></div> 

<p>Text that follows</p> 

これは、次のような出力になります:私は見たいと思っています何

some random text 

Text that follows 

は次のとおりです。

some random text 

some more text 

example of content that will be incorrectly removed 

Text that follows 

任意のアイデア?これを行うには

+0

@Sam C正しい答えをどう受け入れるかをご確認ください – David

答えて

3

代わりにDOMDocumentのようなパーサを使用してください。このコードを考えてみましょう:

<?php 
$dom = new DOMDocument(); 
$dom->loadHTML($your_html_here); 

$xpath = new DOMXpath($dom); 

foreach ($xpath->query("//div[@class='greybackground_desktop']") as $div) 
    $div->parentNode->removeChild($div); 

echo $dom->saveHTML(); 
?> 

スクリプトがhtmlをロードし、div.greybackground_desktopで要素を検索し、これらを削除します。 デモideone.comにあります。

+0

良い答えですが、 'echo $ dom-> saveHTML();'; ')の' echo $ dom-> saveXML(); 'を変更する必要があります –

+1

@PedroLobito:右のところにあります:) – Jan

+1

de nada meu caro ;) –

1

正しい方法はのDOMDocumentようなHTMLパーサを使用している、ここでの例です:

$holder = <<< LOL 
<p>some random text</p> 
<div class="greybackground_desktop" style="background-color:#EFEFEF;"> 
<!-- /49527960/CSF_Article_Middle --> 
<div style="padding-bottom:10px; padding-top: 10px; text-align:center;" id='div-gpt-ad-1441883689230-0'> 
<script type='text/javascript'> 
googletag.cmd.push(function() { googletag.display('div-gpt-ad-1441883689230-0'); }); 
</script> 
</div> 
</div> 
<p>some more text</p> 
<div><p>example of content that will be incorrectly removed</p></div> 
<p>Text that follows</p> 
LOL; 
$dom = new DOMDocument(); 
//avoid the whitespace after removing the node 
$dom->preserveWhiteSpace = false; 
//parse html dom elements 
$dom->loadHTML($holder); 
//get the div from dom 
if($div = $dom->getElementsByTagName('div')->item(0)) { 
    //remove the node by telling the parent node to remove the child 
    $div->parentNode->removeChild($div); 
    //save the new document 
    echo $dom->saveHTML(); 
} 

Ideone DOMDocument Demo



あなたが本当に使用したい場合正規表現、怠け者 1つの.*?の代わりに貪欲.*、すなわち:

$result = preg_replace('%<div class="greybackground_desktop".*?</div>\s+</div>%si', '', $holder); 

Ideone Demo


具体的には、正規表現の繰り返しについてもっと読む "怠惰代わりの貪欲"

http://www.regular-expressions.info/repeat.html


+0

これは**非常に**です!エラーが発生しやすいです、この[regex101.comの例]を見てください(https://regex101.com/r/ dK7jY6/1)ここで私は1つの改行だけを削除しました(明らかに、 'HTML'はまだ有効です)。 – Jan

+0

私の答えの最初の部分は、OPによって提供される例で動作します、正規表現はhtmlと一緒に行く方法ではありません、私たちは皆知っている...それは私が私の答えの2番目の部分を投稿した理由です。 –