我有一个项目,我正在将一些遗留的 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: \$checked\{'?([^']+)'?\}->\{'?([^']+)'?\}
Replace: <?php echo checked('$1', '$2'); ?>
这在我使用的第一个文件中运行良好,但由于某种原因,在当前文件中,正则表达式变得非常贪婪,匹配了很多行。它将匹配开头 (\$checked...),然后匹配到字符 '}' 出现的最后一次。我尝试了一些变体以使其不那么贪婪,包括:
^(.*)\$checked\{'?([^']+)'?\}->\{'?([^']+)'?\}(.*)$
但即使这样似乎也匹配多行。我假设开头的 ^ 只会匹配一行的开头,而末尾的 $ 只会匹配结尾...将我的匹配限制为 1 行...但似乎并非如此。
/me 在正则表达式中失败
感谢您的帮助,迈克