我有一个项目我正在努力将一些遗留的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行...但它似乎不是。

/我在正则表达式中失败

感谢您的帮助, 麦克

有帮助吗?

解决方案

试试这个:

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

* + 之后的使它们“非贪婪”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top