Page 1 of 1

how to delete string between some xml nodes?

Posted: Sun Aug 27, 2006 11:44 am
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?

Posted: Sun Aug 27, 2006 11:50 am
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.

Posted: Sun Aug 27, 2006 12:22 pm
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.

Posted: Sun Aug 27, 2006 12:41 pm
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
?>

Posted: Sun Aug 27, 2006 2:52 pm
by Ollie Saunders
Cool, I learnt something today. Thanks Volka.