2011-01-13 22 views
7

मैं अपने आईडी टैग के आधार पर कुछ लिंक हटाने की कोशिश कर रहा हूं, लेकिन लिंक की सामग्री छोड़ दें। उदाहरण के लिए मैं चालू करने के लिएPHP डोम तत्व छोड़ें सामग्री

Some text goes <a href="http://www.domain.tdl/" id="remove">here</a> 

Some text goes here 

को मैं नीचे का उपयोग कर की कोशिश की है चाहता हूँ।

$dom = new DOMDocument; 
$dom->loadHtml(mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8")); 
$xp = new DOMXPath($dom); 

foreach($xp->query('//a[contains(@id="remove")]') as $oldNode) { 
$revised = strip_tags($oldNode); 
} 

$revised = mb_substr($dom->saveXML($xp->query('//body')->item(0)), 6, -7, "UTF-8"); 
echo $revised; 

मोटे तौर पर here से लिया, लेकिन यह सिर्फ वापस थूक $html की एक ही सामग्री।

कोई विचार यह है कि मैं इसे कैसे प्राप्त करूं?

+0

आप यहां अपना दस्तावेज़ संशोधित नहीं कर रहे हैं, यही कारण है कि यह वही सामग्री थूकता है। उदाहरण आपने डीओएम ऑब्जेक्ट पर 'replaceChild' को कॉल किया है, और आप केवल वैरिएबल बना रहे हैं जिसे आपने बाद में 'saveXML' –

+0

के आउटपुट के साथ ओवरराइट किया है अच्छा प्रश्न, +1। एक एकल XPath अभिव्यक्ति समाधान का मेरा उत्तर देखें जो वास्तव में वांछित नोड्स का चयन करता है। :) –

उत्तर

12

कि के लिए मेरे समारोह है कि:

function DOMRemove(DOMNode $from) { 
    $sibling = $from->firstChild; 
    do { 
     $next = $sibling->nextSibling; 
     $from->parentNode->insertBefore($sibling, $from); 
    } while ($sibling = $next); 
    $from->parentNode->removeChild($from);  
} 

तो यह:

$dom->loadHTML('Hello <a href="foo"><span>World</span></a>'); 
$a = $dom->getElementsByTagName('a')->item(0); // get first 
DOMRemove($a); 

आप देना चाहिए:

Hello <span>World</span> 

एक विशिष्ट आईडी से नोड्स पाने के लिए, का उपयोग XPath:

$xpath = new DOMXpath($dom); 
$node = $xpath->query('//a[@id="something"]')->item(0); // get first 
DOMRemove($node); 
+0

मैंने आपके द्वारा किए गए किसी अन्य पोस्ट पर इस कोड को देखा था लेकिन ए) मुझे एक त्रुटि मिल रही है 'घातक त्रुटि: किसी सदस्य फ़ंक्शन डालने के लिए कॉल करें() गैर-ऑब्जेक्ट पर पहले) और बी) मैं इसे कैसे अनुकूलित करूं केवल एक विशिष्ट आईडी वाले तत्वों को हटा दें? – Jack

+0

@ जैक: क्षमा करें मेरा बुरा, फ़ंक्शन तर्क '$ से '' और 'node' नहीं था। फिक्स्ड। यह बात बताने के लिए धन्यवाद। एक विशिष्ट आईडी आईडी के साथ नोड लाने के लिए एक उदाहरण भी जोड़ा गया। – netcoder

+0

दो प्रश्न; मैं संशोधित डेटा कैसे आउटपुट करूं? और जब मैं उस उदाहरण का उपयोग करता हूं जिसे आपने विशिष्ट आईडी के लिए दिया है, तो मुझे पहले की तरह ही त्रुटि मिलती है। – Jack

1

उपयोग:

//a[@id='remove']/node() 
| 
//*[a[@id='remove']]/node()[not(self::a[@id=''remove])] 

यह किसी भी a मूल्य "remove" साथ विशेषता id होने के सभी बच्चों और है कि न खुद को एक और a होने "remove"

के मूल्य के साथ विशेषता id हैं इस a के सभी पूर्ववर्ती और निम्नलिखित भाई बहन का चयन करता है
2

@ नेटकोडर के उत्तर के समान एक दृष्टिकोण लेकिन एक अलग लूप संरचना और डोमेलेमेंट विधियों का उपयोग करना।

$html = '<html><body>This <a href="http://www.domain.tdl/" id="remove">link</a> was removed.</body></html>'; 
$dom = new DOMDocument(); 
$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
foreach ($xpath->query('//a[@id="remove"]') as $link) { 
    // Move all link tag content to its parent node just before it. 
    while($link->hasChildNodes()) { 
    $child = $link->removeChild($link->firstChild); 
    $link->parentNode->insertBefore($child, $link); 
    } 
    // Remove the link tag. 
    $link->parentNode->removeChild($link); 
} 
$html = $dom->saveXML(); 
+0

'$ child = $ link-> removeChild ($ link-> firstChild);' बस '$ child = $ link-> firstChild; 'के रूप में लिखा जा सकता है? – myol

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