Предполагая, что у вас есть только один набор [TAG]..[/TAG]
на узел (например, если у вашего документа есть два набора, они находятся внутри отдельных элементов <p>
или чего-то еще), и что они всегда родные:
Вы можете использовать preceding-sibling
и following-sibling
, чтобы выбрать только элементы, которым предшествует текстовый узел [TAG], а затем текстовый узел [/ TAG]:
//span[preceding-sibling::text()[normalize-space(.) = "[TAG]"]][following-sibling::text()[normalize-space(.) = "[/TAG]"]]
Полный пример PHP:
$doc = new DOMDocument();
$doc->loadHTMLFile('test.xml');
$xpath = new DOMXPath($doc);
foreach ($xpath->query('//span[preceding-sibling::text()[normalize-space(.) = "[TAG]"]][following-sibling::text()[normalize-space(.) = "[/TAG]"]]') as $el) {
$el->nodeValue = 'Changed!';
}
echo $doc->saveXML();