2008-12-30 207 views
1

我有一个项目,我正在将一些遗留的perl cgi表单转换为PHP。很多这需要查找/替换信息。在这样一个情况下,我在Perl脚本这样行:Textmate正则表达式查找替换帮助

<INPUT type="radio" name="trade" value="1" $checked{trade}->{1}> 

这需要阅读:

<INPUT type="radio" name="trade" value="1" <?php echo checked('trade', 1); ?>> 

另一个例子来显示一些变化如何将这些标签可能会在Perl中露面/ html:

<INPUT type="radio" name="loantype" value="new" $checked{loantype}->{new}> 
<INPUT type="radio" name="loantype" value="new" $checked{'loantype'}->{new}> 
<INPUT type="radio" name="loantype" value="new" $checked{'loantype'}->{'new'}> 
<INPUT type="radio" name="loantype" value="new" $checked{loantype}->{'new'}> 

正如你所看到的,引号可以在任何地方,但这不是我的问题。我决定在textmate中编写一个查找/替换正则表达式,让我的生活变得更轻松。我正则表达式是这样的:

Find:  \$checked\{'?([^']+)'?\}->\{'?([^']+)'?\} 
Replace: <?php echo checked('$1', '$2'); ?> 

这在我做的第一个文件工作正常,但由于某些原因,在当前文件中的正则表达式已经变得非常贪婪,配套多条线路。它会匹配begininng(\ $ checked ...),然后匹配上一次出现字符'}'的时间。我尝试了一些变化,使其不太贪心,包括:

^(.*)\$checked\{'?([^']+)'?\}->\{'?([^']+)'?\}(.*)$ 

但即使这似乎匹配多行。我认为在开始时^只会匹配一行的开始,而$在最后只会匹配结束......将我的匹配限制为1行......但看起来并不是这样。

/我无法在正则表达式

感谢您的帮助, 迈克

回答

2

试试这个:

^(.*?)\$checked\{'?([^']+?)'?\}->\{'?([^']+?)'?\}(.*?)$ 

?*+后让他们 “非贪婪”。

+0

谢谢,这是完美的作品。 – 2008-12-30 18:53:38