PHP - 正则表达式删除引号并添加大括号?

时间:2010-12-08 04:43:58

标签: php regex replace preg-replace

好吧,我讨厌承认它,但我很难用REGEX,我找不到一个关于如何设置表达式的体面教程。

所以说我有类似的东西

context['something']

我希望将所有匹配项更改为

context[something] 

然后我

' . $var . ' 

我希望将所有匹配项更改为

{var} 

这是当前的概念,但我遇到了正则表达式部分的问题。我正在使用str_replace,但是如果语言发生了变化,我认为它不会那么稳定。

这是我的尝试。

$codes = array (
         '/(\' \. \$)(.+)( \. \')/',
        '/(\[\')(.+)(\'\])/'
);
$html = array (
        '{\\2}',
        '[\\2]',
);
$data = preg_replace($codes, $html, $data); 

直到你把它们分配到一个文件然后它变坏了它才有效。

这是当前的设置

// these are temp need a better replace system
$data = str_replace("' . $", "{", $data);
$data = str_replace(" . '", "}", $data);
$data = str_replace("<?php", "", $data);
$data = str_replace("?>", "", $data);
$data = str_replace('context[\'forum_name\']', 'context[forum_name]', $data); 

只需要一种正确的方式来评论它们,以便稍后在保存期间将它们转换回来。

有人可以帮忙吗?

谢谢:)

3 个答案:

答案 0 :(得分:5)

让你的比赛非贪婪

更改

.+

.+?

It works!!

<强>解释

默认情况下,量词+是贪婪的。

考虑正则表达式\[(.+)\],它会尝试匹配并捕获[]之间的所有内容。在输入[foo]上,它可以正常工作并捕获foo。但是在输入[foo] and [bar]上它会捕获foo] and [bar!这是行动中的贪婪行为,使+尽可能多地消耗。通过使匹配非贪婪\[(.+?)\],我们告诉+尽可能少地使用但仍尝试匹配。所以在这种情况下使用相同的输入它将捕获foo

一些提示:

您的正则表达式中不需要第1组和第3组:'/(\' \. \$)(.+)( \. \')/'。所以你可以放弃第一对和第三对(...)。如果您只想分组使用(?:..)而不是(..)用于分组+捕获。

不鼓励在替换部件中使用\\n。它应该仅用作正则表达式中的反向引用。要在替换部件中使用捕获组,请使用$n

Program with above changes

答案 1 :(得分:1)

我在学习正则表达式时发现this tool非常有帮助。

答案 2 :(得分:0)

这是一个:

preg_replace("/context\['([^\']+)'\]/", "context[$1]", "context['bob']");

而不是使用非贪婪的匹配,我们只是寻找任何不是引号的东西。

另一个:

preg_replace("/' . [$]([^ ]+) . '/", '{$1}', '\' . $foo . \'');

这个有点棘手。我们必须在一个集合中捕获$,因此它不被视为字符串结尾字符。并且{$ 1}必须是单引号,因此PHP不会将其解释为大括号作为变量。