1

我有一个项目,我正在将一些遗留的 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 在正则表达式中失败

感谢您的帮助,迈克

4

1 回答 1

2

试试这个:

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

?之后*并使+他们“不贪婪” 。

于 2008-12-30T18:49:30.923 回答