我有一个项目我正在努力将一些遗留的perl cgi表单转换为PHP。其中很多都需要查找/替换信息。在一个这样的例子中,我在perl脚本中有这样的行:
<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 / replace正则表达式,让我的生活更轻松一些。我的正则表达式看起来像:
Find: \$checked\{'?([^']+)'?\}->\{'?([^']+)'?\}
Replace: <?php echo checked('$1', '$2'); ?>
这在我用它做的第一个文件中运行良好,但由于某些原因在当前文件中正则表达式变得非常贪婪,匹配许多行。它将匹配begininng(\ $ checked ...),然后匹配最后一次出现'}'字符。我尝试了一些变化,使它不那么贪心,包括:
^(.*)\$checked\{'?([^']+)'?\}->\{'?([^']+)'?\}(.*)$
但即使这似乎匹配多行。我假设开头的^只匹配一行的开头,而结尾的$只匹配结束...将我的匹配限制为1行...但它似乎不是。
/我在正则表达式中失败
感谢您的帮助, 麦克
答案 0 :(得分:2)
试试这个:
^(.*?)\$checked\{'?([^']+?)'?\}->\{'?([^']+?)'?\}(.*?)$
?
后*
和+
使他们“非贪婪”。