好吧,我讨厌承认它,但我很难用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);
只需要一种正确的方式来评论它们,以便稍后在保存期间将它们转换回来。
有人可以帮忙吗?
谢谢:)
答案 0 :(得分:5)
让你的比赛非贪婪。
更改
.+
到
.+?
<强>解释强>
默认情况下,量词+
是贪婪的。
考虑正则表达式\[(.+)\]
,它会尝试匹配并捕获[
和]
之间的所有内容。在输入[foo]
上,它可以正常工作并捕获foo
。但是在输入[foo] and [bar]
上它会捕获foo] and [bar
!这是行动中的贪婪行为,使+
尽可能多地消耗。通过使匹配非贪婪\[(.+?)\]
,我们告诉+
尽可能少地使用但仍尝试匹配。所以在这种情况下使用相同的输入它将捕获foo
。
一些提示:
您的正则表达式中不需要第1组和第3组:'/(\' \. \$)(.+)( \. \')/'
。所以你可以放弃第一对和第三对(...)
。如果您只想分组使用(?:..)
而不是(..)
用于分组+捕获。
不鼓励在替换部件中使用\\n
。它应该仅用作正则表达式中的反向引用。要在替换部件中使用捕获组,请使用$n
。
答案 1 :(得分:1)
我在学习正则表达式时发现this tool非常有帮助。
答案 2 :(得分:0)
这是一个:
preg_replace("/context\['([^\']+)'\]/", "context[$1]", "context['bob']");
而不是使用非贪婪的匹配,我们只是寻找任何不是引号的东西。
另一个:
preg_replace("/' . [$]([^ ]+) . '/", '{$1}', '\' . $foo . \'');
这个有点棘手。我们必须在一个集合中捕获$,因此它不被视为字符串结尾字符。并且{$ 1}必须是单引号,因此PHP不会将其解释为大括号作为变量。