2016-04-15 96 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文檔 –