2016-04-15 95 views
-1

我有形成XML那样的config.ini文件:正则表达式:如何删除XML标签风格

<positions> 

    <position> 
     <name>BLOCK TAB 1</name> 
     <tag>[BLOCK_TAB_1]</tag> 
    </position> 


    <position> 
     <name>PERSONALAREA</name> 
     <tag>[PERSONALAREA]</tag> 
    </position> 
</positions> 

我试图删除块:使用的preg_replace

<position> 
    <name>BLOCK TAB 1</name> 
    <tag>[BLOCK_TAB_1]</tag> 
</position> 

$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

“” \ n \ S + BLOCK TAB 1 \ n \ S + \ [BLOCK_TAB_1 \] \ n \ S + “ '使用这个或'” \ n \ S + 。* \ n \ S + 。* \ n \ S +“' – Ashish

+0

@Ashish谢谢你!我试过但没有运气。 –

回答

3

You shouldn't use regex解析这个XML。在这个例子中,你可以使用XPath很容易地识别出具有文本“块凸起1”的<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

+0

是的,没有正则表达式,这是正确的使用工具 – Ghost

+0

谢谢! DOMDocument和simpleXML有一些问题:我的文本是越南语,解析后会出现这样的问题'''Đ â yl à giao di&#x1EC7; n m&#x1EB7; c đ&#x1ECB; nh c& #x1EE7; h&#x1EC7; ''' –

+0

您需要设置相应的编码,当你调用DOM文档 –