正则表达式:如何删除XML标记样式

时间:2016-04-15 04:28:56

标签: php regex

我有一个像这样形成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>标记,但由于内部标记,因此替换无效。

有人有想法吗?

1 个答案:

答案 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();

Example