how to delete string between some xml nodes?

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
aigarzzz
Forum Newbie
Posts: 9
Joined: Thu Apr 06, 2006 1:43 am

how to delete string between some xml nodes?

Post by aigarzzz »

i have a xml string in php varible:
$string="...<somenode>val1</somenode><mustdelete>val2</mustdelete>...<somenode>val3</somenode><mustdelete>val4</mustdelete>";
how can i delete with php all content between each <mustdelete> node?
User avatar
feyd
Neighborhood Spidermoddy
Posts: 31559
Joined: Mon Mar 29, 2004 3:24 pm
Location: Bothell, Washington, USA

Post by feyd »

Quick answer: 2 × strpos() + substr_replace() or preg_replace().

preg_replace() uses regular expressions. There have been many threads on finding the data between two known points. Take a look in Regex.
User avatar
Ollie Saunders
DevNet Master
Posts: 3179
Joined: Tue May 24, 2005 6:01 pm
Location: UK

Post by Ollie Saunders »

Using an XML dom you can do this:

Code: Select all

$input = '<atag><mustdelete>stuff</mustdelete><b>stuff</b></atag>';
$dom = new DOMDocument();
$dom->loadXML($input);
$mustdeletes = $dom->getElementsByTagName('mustdelete');
foreach ($mustdeletes as $item) {
    $item->parentNode->removeChild($item);
}
echo htmlspecialchars($dom->saveXML(), ENT_QUOTES);

Code: Select all

<?xml version="1.0"?> <atag><b>stuff</b></atag>
Tested.
User avatar
volka
DevNet Evangelist
Posts: 8391
Joined: Tue May 07, 2002 9:48 am
Location: Berlin, ger

Post by volka »

but try

Code: Select all

$input = '<atag><mustdelete>stuffA</mustdelete><mustdelete>stuffB</mustdelete><b>stuff</b></atag>';

Code: Select all

<?php
$input = '<atag><mustdelete>stuffA</mustdelete><mustdelete>stuffB</mustdelete><b>stuff</b></atag>';
$dom = new DOMDocument();
$dom->loadXML($input);
$mustdeletes = $dom->getElementsByTagName('mustdelete');

while( 0 < $mustdeletes->length ) {
	$item = $mustdeletes->item(0);
	$item->parentNode->removeChild($item);
}

echo $dom->saveXML(); // testing with php cli
?>
User avatar
Ollie Saunders
DevNet Master
Posts: 3179
Joined: Tue May 24, 2005 6:01 pm
Location: UK

Post by Ollie Saunders »

Cool, I learnt something today. Thanks Volka.
Post Reply