2013-11-04 87 views
0

我试图用 <center><h*>.....</h*></center>这个问题我现在面临更换头标记<h*>是当我有开始于一行,并在结束的标头标记的<center>标签不缠一些其他线路例如。匹配XML标签并替换其值

<h3> Spotting the 
    Pileated 
    HummingBird in 
    the wild </h3> 

我想用<center><h*> .. </h*></center>标记替换标题标记。

这是我正在尝试它的工作良好它标题标记开始和结束在同一行,但不是多行。

while (<>){ 
      $_ =~ s/^\<h(.)>\s*(.*)\s*<\/h(.)>/<center><h$1>$2<\/h$3><\/center>/g; 
     print $_; 
} 
+4

不要用正则表达式来做这件事,请为此使用XML解析器,这对未来会更好。 –

+0

有一个特殊的条件,只有在行开始时给出的标题标签应该被考虑用于替换,而不是在它们之间具有一些前导空格的标签。这就是为什么我认为我应该使用正则表达式。我的一个工作,但不是那些开始和结束于不同行的标签。 – kay

回答

0

那么我必须说,使用XML解析器将进一步缓解你的生活。但是,如果考虑应用多重正则表达式,找到正则表达式不应该那么困难。我测试了下面的一段代码,它工作。

my $str = '<h3> Spotting the 
    Pileated 
    HummingBird in 
    the wild </h3>'; 

$str =~ s/(<h\d>[\n\s\w]*<\/h\d>)/<center>$1<\/center>/mg; 
                ^
                 |------ for multiline regex 
print $str; 

正如你可以看到使用/m会让你写的多行相匹配的表达。希望这会有所帮助。

​​这里只是基于您给出的示例文本。您可能需要修改它以符合您的原始要求。