我有一个像这样形成XML的config.ini文件:
<positions>
<position>
<name>BLOCK TAB 1</name>
<tag>[BLOCK_TAB_1]</tag>
</position>
<position>
<name>PERSONALAREA</name>
<tag>[PERSONALAREA]</tag>
</position>
</positions>
我试图删除该块:
<position>
<name>BLOCK TAB 1</name>
<tag>[BLOCK_TAB_1]</tag>
</position>
使用preg_replace
$find1 = "/<name>BLOCK TAB 1<\/name>/";
$find2 = "/<tag>\[BLOCK_TAB_1\]<\/tag>/";
$contents = preg_replace($find1, "", $contents);
$contents = preg_replace($find2, "", $contents);
但内容将是
<positions>
<position>
</position>
<position>
<name>PERSONALAREA</name>
<tag>[PERSONALAREA]</tag>
</position>
</positions>
空的<position>
标记(内置标签)仍在此处。
尝试使用/<position[^>]*><\\/position[^>]*>/
替换空<position>
标记,但由于内部标记,因此替换无效。
有人有想法吗?
答案 0 :(得分:3)
You shouldn't use regex来解析这个XML。在此示例中,您可以使用XPath轻松识别具有文本&#34; BLOCK TAB 1&#34;的<name>
,然后选择其父项并将其删除:
$doc = new DOMDocument;
$doc->loadXML($xml);
$xpath = new DOMXpath($doc);
$positions = $xpath->query('//name[text()="BLOCK TAB 1"]/parent::position');
foreach ($positions as $position) {
// Remove it
$position->parentNode->removeChild($position);
}
echo $doc->saveXML();