2012-06-23 5 views
6

मैं strip_tags() फ़ंक्शन का उपयोग करता हूं लेकिन मुझे कुछ टैग (और उनकी सभी सामग्री) को हटाने की आवश्यकता है।PHP: strip_tags - केवल कुछ टैग (और उनकी सामग्री) को हटा दें?

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

मान लें, मैं पी और स्पैन टैग से छुटकारा पाने की जरूरत है, और केवल रखें::

उदाहरण के लिए

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

strip_tags उम्मीद एक दूसरे पैरामीटर के रूप में टैग है कि आप रखना की इच्छा है।

इस विशेष उदाहरण में मैं striptags($html, "<div>"); का उपयोग कर सकता हूं लेकिन एचटीएमएल मैं स्क्रैपिंग कर रहा हूं और टैग जिन्हें हटाया जाना आवश्यक है, हर समय अलग-अलग होते हैं।

मैंने अपनी आवश्यकताओं के अनुरूप एक समारोह के लिए घंटों की खोज की, लेकिन कुछ भी उपयोगी नहीं मिला।

कोई विचार है?

+2

[DOM] (http://php.net/dom) और [XPath] (http://uk.php.net/manual/en/class.domxpath.php) से शुरू करें – DaveRandom

+1

प्रश्न पहले से ही यहां उत्तर दिया गया है: http://stackoverflow.com/questions/9788621/is-there-an-alternative-to-phps-strip-tags – Jocelyn

+0

मैंने इस पोस्ट में स्वीकृत उत्तर की कोशिश की लेकिन परिणाम – Dylan

उत्तर

11

नियमित अभिव्यक्ति का उपयोग करें। कुछ इस तरह काम करना चाहिए:

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

demo यह कुछ भी नहीं के साथ वांछित टैग की जगह को दर्शाता है।

ध्यान दें कि आपको टैग के भीतर सफेद जगहों की क्षतिपूर्ति करने के लिए, या अन्य अज्ञातों को प्रदर्शित करने की आवश्यकता हो सकती है, जो कि आपका उदाहरण प्रदर्शित नहीं करता है।

यहाँ regex के साथ या गुण के बिना टैग कब्जा करने के लिए उपयोग करने के लिए है:

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

@Downvoter से संतुष्ट नहीं था - कोई भी टिप्पणी मेरे कार्यात्मक उत्तर को कम क्यों किया गया था? – nickb

+2

धन्यवाद, यह मेरी स्थिति के लिए बिल्कुल सही है। मैं सरल एचटीएमएल डोम पार्सर का उपयोग कर एचटीएमएल स्क्रैप कर रहा हूं और बस कुछ अतिरिक्त स्ट्रिपिंग की जरूरत है। – Dylan

+0

अपडेट: यह रेगेक्स केवल गुणों के बिना सिंगल टैग स्ट्रिप्स करता है ... निम्नलिखित काम करता है: $ text = preg_replace ('# <('। Implode ('|', $ टैग)।)। *>। *? # एस ',' ', $ पाठ); – Dylan

1

आप कहते हैं कि आप साधारण HTML डोम का उपयोग कर रहे हैं (! अच्छा है कि HTML पार्स करने के लिए सही तरीका है)। जब मैं एक टैग और उसकी सामग्री को दूर करने के लिए की जरूरत है, मुझे क्या करना:

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

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

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

अंतिम पंक्ति क्योंकि डोम भ्रमित हो जाता है ताकि पूरे डोम ढह हो गया है के बाद संशोधनों के बने होते हैं और उसके बाद फिर से पार्स की आवश्यकता है ताकि परिवर्तन स्थायी बनाये जाते हैं (आईएमओ, सरल HTML डीओएम में एक बग)।

सरल HTML डोम दृष्टिकोण नियमित अभिव्यक्ति से सुरक्षित और अधिक स्थिर है।

संबंधित मुद्दे