2014-02-18 48 views
0

我正在嘗試修改現有的xml文本,以便在特定標籤內添加開始標籤和結束標籤。 我想在那裏使用正則表達式(在Perl中),但我在那裏做錯了什麼。使用正則表達式通過Perl將xml開始和結束標籤添加到xml文本

首先爲例原文:

...... 
<xvcs:insert id="1" name="test1" data="mydata"><b>Test1</b></div> 
<xvcs:insert id="2" name="test2" class="result">Test2</div> 
..... 

我希望每一個標籤後,每個標籤之前添加。

因此,它應該是:

<xvcs:insert id="1" name="test1" data="mydata"><span class="test"><b>Test1</b></span></div> 
<xvcs:insert id="2" name="test2" class="result"><span class="test">Test2</span></div> 

我走到這一步是:

$newtext =~ s/(\<xvcs\:insert(.)+\>)/$1<span class="test">/g; 
$newtext =~ s/(\<\/xvcs\:insert\>)/<\/span>$1/g; 

但按預期不起作用。第一部分甚至在沒有預期的情況下添加它。

所以我的問題是在那裏如何做得更好/更穩定? (或我在那裏做錯了什麼?)

(結果必須是一個字符串,這就是爲什麼我去了正則表達式路徑,因爲我不想通過一個數組並將數組元素再次組合到一個字符串中逐個)。

+0

請編輯您的問題,並添加你想要得到的字符串。 –

+0

我現在也添加它作爲字符串(沒有想到它,因爲我描述了它) – Thomas

回答

1

您有:

s/(\<xvcs\:insert(.)+\>)/$1<span class="test">/g 

盪滌:

s/(<xvcs:insert.+>)/$1<span class="test">/g 

的問題是,.+過於寬容。以下>與「<b>」中的相符。修正:

s/(<xvcs:insert[^>]*>)/$1<span class="test">/g; 

一起:

$newtext =~ s{(<xvcs:insert[^>]*>)}{$1<span class="test">}g; 
$newtext =~ s{(</xvcs:insert>)}{</span>$1}g; 

或者,如果你有5.10+(用於\K):

$newtext =~ s{<xvcs:insert[^>]*>\K}{<span class="test">}g; 
$newtext =~ s{(?=</xvcs:insert>)}{</span>}g; 
相關問題