2012-08-07 242 views
1

我试图获取两个大括号之间的内容或Smarty标记。我想,只有Smarty的函数变量,忽略if的等正则表达式preg_match PHP

下面是样本串标签:

{{$variable|lower}} [亦宜]

{{$variable|escape:javascript}} [亦宜]

{{$variable|str_replace:"search":"replace"}} [亦宜]

{{if $test eq "test"}} [应当NOT是垫高等教育委员会]

{{section name=foo start=10 loop=20 step=2}} [应匹配]

如果我这样做

preg_match_all('/{{\$?(\w+?[\W\w]*?)}}/',$str,$matches) 

它得到括号内的一切。

preg_match_all('/{{\$?(\w+?\W*?\w*?)}}/',$str,$matches); 

这只会得到“变量|转义”。

请帮助正确的正则表达式。

感谢

+2

这是什么你正在努力实现?这可能比尝试重新设计已经非常糟糕的Smarty更好。 – 2012-08-07 14:29:07

+0

@Michael我希望我能+10 – DaveRandom 2012-08-07 14:29:41

+0

@DaveRandom我的两个最大的编程遗憾是围绕着Smarty构建的。 – 2012-08-07 14:30:49

回答

0

我可能是错的,但不会简单地说:

preg_match_all('/\{\{(\$[^|]+)\|[^}]+\}\}/',$str,$matches); 

做的伎俩,在那里$matches[1]将举行的变量。如果文件中包含回车(窗口\ r \ n),尝试'/\{\{(\$[^|]+)\|[^}]+\}\}/s',与s修改

包括像火柴:{{$var}}

//{{$var|foo}} {{$varbar}} bar as test string 
preg_match_all('/\{\{(\$[^|}]+)(\|[^}]+|)\}\}/s',$str,$matches); 
//shorter still: 
preg_match_all('/\{\{(\$[^|}]+)\|?[^}]*\}\}/s',$str,$matches); 

回报:

array (
    0 => 
    array (
    0 => '{{$var|foo}}', 
    1 => '{{$varbar}}', 
), 
    1 => 
    array (
    0 => '$var', 
    1 => '$varbar', 
), 
    2 => //not in the array when using the second pattern 
    array (
    0 => '|foo', 
    1 => '', 
), 
) 
+0

对不起,我忘了提及,但它是否可以只支持{{$ variable}}? – user1105950 2012-08-07 14:48:51

+0

谢谢。你能建议我一些很好的RegEx教程吗? – user1105950 2012-08-07 16:16:48

+0

那么,我已经学会了JS控制台的基础知识,使用[this site](http://www.regular-expressions.info/)作为我的主要参考。虽然他们也有一些关于php正则表达式的信息。我也经历了大量的试验和错误,以便掌握这一切,但[在线功能](http://www.functions-online.com),[writecodeonline](http://writecodeonline.com/php/) )和[codepad](http://codepad.org/)是很好的沙箱...基本上只是留在它,实践是最好的导师恕我直言。只是阅读基础知识,并练习,我不认为有一个神奇的啧啧在那里...对不起 – 2012-08-07 16:35:10

0

使用正则表达式\{\{.*?\|.*.+?\}\}

+0

对不起,但它没有匹配 – user1105950 2012-08-07 14:37:59