2012-05-18 76 views
0

好,因爲它是WordPress的問題,它黯然去得更深一些,我需要刪除父DIV的每一個表示其內:如何刪除整個DIV用了preg_replace

<div class="sometestclass"> 
    <img ....> 
    <div>.....</div> 
    any other html tags 
</div><!-- END: .sometestclass --> 

我唯一的想法是匹配的開頭一切:

<div class="sometestclass"> 

,結尾是:

<!-- END: .sometestclass --> 

儘管我之間(我可以標記父母div的結尾,無論如何我想要的,這只是一個示例)。 任何人有一個想法如何做到這一點的:

<?php $content = preg_replace('?????','',$content); ?> 
+5

[不解析與正則表達式,nanananana HTML 。](http://stackoverflow.com/a/1732454/333786) –

+0

Brace我們自己 –

+0

我知道,我知道,str_replace我應該使用;) –

回答

9

我不會用正則表達式。相反,我會使用DOMDocument類。只要找到所有與類div元素,並從他們的父母(S)將其刪除:

$html = "<p>Hello World</p> 
     <div class='sometestclass'> 
      <img src='foo.png'/> 
      <div>Bar</div> 
     </div>"; 

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

$xpath = new DOMXPath($dom); 
$pDivs = $xpath->query(".//div[@class='sometestclass']"); 

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

echo preg_replace("/.*<body>(.*)<\/body>.*/s", "$1", $dom->saveHTML()); 

導致:

<p>Hello World</p> 
+0

可悲的是我有不知道它:(. 你能解釋一些樣品嗎? –

+0

而不是循環所有的divs,他可以使用XPath查詢,直接找到正確的類的div。 –

+0

@PascalMARTIN很好的建議。我會就這個例子工作。 – Sampson

0

怎麼樣只是一些CSS .sometestclass{display: none;}

+0

對不起,它需要在php中完成:) –

6
<?php $content = preg_replace('/<div class="sometestclass">.*?<\/div><!-- END: .sometestclass -->/s','',$content); ?> 

我RegEx有點生疏,但我認爲這應該工作。請注意,正如其他人所說,RegEx沒有適當的配置來處理HTML的一些複雜性。

此外,該模式不會找到嵌入式div元素與類sometestclass。你需要爲此遞歸。

+0

這可能工作,但已經使用了DOMDocument方法。但是,感謝RegEx,它更容易學習示例:) –

0

對於UTF-8的問題,我發現了一個黑客在PHP-manual

所以我的功能如下所示:

function rem_fi_cat() { 
/* This function removes images from _within_ the article. 
* If these images are enclosed in a "wp-caption" div-tag. 
* If the articles are post formatted as "image". 
* Only on home-page, front-page an in category/archive-pages. 
*/ 
if ((is_home() || is_front_page() || is_category()) && has_post_format('image')) { 
    $document = new DOMDocument(); 
    $content = get_the_content('', true); 
    if('' != $content) { 
     /* incl. UTF-8 "hack" as described at 
     * http://www.php.net/manual/en/domdocument.loadhtml.php#95251 
     */ 
     $document->loadHTML('<?xml encoding="UTF-8">' . $content); 
     foreach ($doc->childNodes as $item) { 
      if ($item->nodeType == XML_PI_NODE) { 
       $doc->removeChild($item); // remove hack 
       $doc->encoding = 'UTF-8'; // insert proper 
      } 
     } 
     $xpath = new DOMXPath($document); 
     $pDivs = $xpath->query(".//div[@class='wp-caption']"); 

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

     echo preg_replace("/.*<div class=\"entry-container\">(.*)<\/div>.*/s", "$1", $document->saveHTML()); 

    } 
} 

}