2012-06-23 23 views
6

strip_tags() işlevini kullanıyorum ancak bazı etiketlerini (ve tüm içeriğini) kaldırmalıyım.PHP: strip_tags - sadece belirli etiketleri (ve içeriklerini) kaldırın?

<div> 
    <p class="test"> 
    Test A 
    </p> 
    <span> 
    Test B 
    </span> 
    <div> 
    Test C 
    </div> 
</div> 

Ben P ve SPAN etiketleri kurtulmak gerekir diyelim ve sadece tutmak: Örneğin

<div> 
    <div> 
    Test C 
    </div> 
</div> 

strip_tags beklediği ikinci parametre olarak etiketleri olduğunu sen TUTMAK istiyorum.

Bu örnekte, striptags($html, "<div>"); 'u kullanabilirim ancak kazıma yaptığım html ve kaldırılması gereken etiketler her zaman farklıdır.

Gereksinimlerime uyan bir işlev için saatler aradım, ancak yararlı bir şey bulamadım.

Herhangi bir fikir nedir?

+2

[DOM] ile başla (http://php.net/dom) ve [XPath] (http://uk.php.net/manual/en/class.domxpath.php) – DaveRandom

+1

Soru burada zaten yanıtladı: http://stackoverflow.com/questions/9788621/is-there-an-alternative-to-phps-strip-tags – Jocelyn

+0

Bu gönderide kabul edilen cevabı denedim, ancak sonuçlardan memnun kalmadı – Dylan

cevap

11

Düzenli bir ifade kullanın. Böyle bir şey çalışması gerekir:

$tags = array('p', 'span'); 
$text = preg_replace('#<(' . implode('|', $tags) . ')>.*?<\/$1>#s', '', $text); 

demo hiçbir şey ile istenilen etiketleri yeniden gösterir.

Etiketlerdeki boşlukları veya örneğinizin göstermediği diğer bilinmeyenleri telafi etmek için daha fazla ayar yapmanız gerekebileceğini unutmayın. İşte

regex ile veya nitelikler olmaksızın etiketlerini yakalamak için kullanmaktır:

'#<(' . implode('|', $tags) . ')(?:[^>]+)?>.*?<\/$1>#s' 
+0

@Downvoter - Herhangi bir yorum olarak Fonksiyonel cevabım neden düşürüldü? – nickb

+2

Teşekkürler, bu benim durumum için mükemmel. Ben basit html dom ayrıştırıcısı kullanarak HTML kazıyorum ve sadece bazı ekstra sıyırma gerekli. – Dylan

+0

GÜNCELLEME: bu regex öznitelikler olmadan yalnızca tek etiketler çıkarır ... aşağıdaki gibi görünüyor: $ text = preg_replace ('# <(' .psode ('|', $ tags). '). *>. *? #s ',' ', $ metin); – Dylan

1

Sen Basit HTML DOM kullanarak söylemek (! O iyi HTML ayrıştırmak doğru yoldur). Ben bir etiket ve içeriğini kaldırmak gerektiğinde, yapmam: DOM modifikasyonlar tüm DOM çöktü zorundadır böylece yapılan ve daha sonra tekrar çözümlenir sonra karışır için son satırın gereklidir

$rows = $html->find("span"); 

foreach ($rows as $row) 
{ 
    $row->outertext = ""; 
} 

$html->load($html->save()); 

böylece değişiklikler kalıcı hale getirilir (IMO, Basit HTML DOM'da bir hata).

Basit HTML DOM yaklaşımı, düzenli bir ifadeden daha güvenli ve daha kararlıdır.

İlgili konular