2013-07-26 61 views
1

我可以顶替以下的正则表达式为一个正则表达式在Perl替换多个正则表达式到perl的正则表达式的一个

message =~ s/&lt;span&gt;(.*?)&lt;\/span&gt;/<span>$1<\/span>/g; 
message =~ s/&lt;em&gt;(.*?)&lt;\/em&gt;/<em>$1<\/em>/g; 
message =~ s/&lt;ul&gt;(.*?)&lt;\/ul&gt;/<ul>$1<\/ul>/g; 
message =~ s/&lt;ol&gt;(.*?)&lt;\/ol&gt;/<ol>$1<\/ol>/g; 

回答

3

你可以这样说:

message =~ s# 
     &lt; 
     (?<tag>span|em|ul|ol) 
     &gt; 
     (.*?) 
     &lt; 
    /
     \k<tag> 
     &gt; 
    # 
     <$+{tag}> 
     $2  
     </$+{tag}> 
    #xg; 
+2

这是一个非常优雅的答案,但它并不严格等同。比较“encode_entities”的结果foo“。由于这个答案没有递归,所以输出将是' <em> foo </em >'。 – amon

+0

@amon。是的,这是一个问题。嵌套标签在将HTML与正则表达式结合时总会遇到问题。 –

+0

是的,这是一个问题...嵌套标签的任何解决方案...我需要这个为我的文本转换... – manu

1

我不知道你需要捕获标签之间的内容。为什么不简单替换标签名称周围的&lt;&gt;

message =~ s#&lt;(/?(?:span|em|[uo]l))&gt;#<$1>#g;