Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Preg匹配小胡子lambdas和其他;复杂的;胡子变量_Php_Regex_Mustache_Mustache.php - Fatal编程技术网

Php Preg匹配小胡子lambdas和其他;复杂的;胡子变量

Php Preg匹配小胡子lambdas和其他;复杂的;胡子变量,php,regex,mustache,mustache.php,Php,Regex,Mustache,Mustache.php,在使用mustache进行模板呈现之前,我们有一个PHP类,用于翻译文本进行本地化。基本上,它接受了数量可变的参数,搜索数据库中第一个参数的翻译,然后在翻译中替换为各自部分的变量。下面您将看到该类使用的转换函数的定义: function translateText($text, $param1, $param2, ...., $paramX) { // search for the $text in the database, and retrieve the translation f

在使用
mustache
进行模板呈现之前,我们有一个PHP类,用于翻译文本进行本地化。基本上,它接受了数量可变的参数,搜索数据库中第一个参数的翻译,然后在翻译中替换为各自部分的变量。下面您将看到该类使用的转换函数的定义:

function translateText($text, $param1, $param2, ...., $paramX) {
    // search for the $text in the database, and retrieve the translation for it
    // if params are present, replace the %d strings from the translated text, with the params
}
例如,我可以向函数输入如下内容:

translateText("%0, please fetch me the bread", "Adam");
用匈牙利语翻译成

将ide添加到kenyeret%0

然后%0参数将被替换为my name,该名称是为函数中的第二个参数输入的

我试着用
mustache
做一些类似的事情,它的
lambda
功能和重用我的旧功能。它看起来像这样:

function($text, $helper) { 
   preg_match_all("/{{[#a-zA-Z0-9._-]+}}/", $text, $matches);
   $translateParams = array();
   foreach ($matches[0] as $iterator => $match) {
      $text = str_replace($match, '%'.$iterator, $text);
      $translateParams[] = $helper->render($match);
   }
   array_unshift($translateParams, $text);
   return call_user_func_array('translateText', $translateParams);
}
 {{# func.Translate }} Translate this, and {{# func.Translate }} translate this separately {{/ func.Translate }} {{/ func.Translate }}
对于基本用法,它工作得很好,但是如果我尝试在翻译中翻译一些东西,比如:

function($text, $helper) { 
   preg_match_all("/{{[#a-zA-Z0-9._-]+}}/", $text, $matches);
   $translateParams = array();
   foreach ($matches[0] as $iterator => $match) {
      $text = str_replace($match, '%'.$iterator, $text);
      $translateParams[] = $helper->render($match);
   }
   array_unshift($translateParams, $text);
   return call_user_func_array('translateText', $translateParams);
}
 {{# func.Translate }} Translate this, and {{# func.Translate }} translate this separately {{/ func.Translate }} {{/ func.Translate }}
我得到了错误,因为我的正则表达式匹配器将分别匹配每个内部的mustache标记

它匹配:
{{{func.Translate}
,和
{/func.Translate}
而不是匹配
{{func.Translate}}单独翻译这个{/func.Translate}


我的问题是,对于正则表达式,我是一个新手,我不知道如何匹配单个
preg_match
,既可以匹配简单的
mustache
表达式(
{{variable}
),也可以匹配示例中更复杂的表达式。任何人可以帮助我吗吗?

我想你需要一些东西,我想你需要一些东西,我想你需要一些东西,我想你需要一些东西,我想你需要一些东西,我想,我想你需要一些东西,我想你需要一些东西,我想你想你需要,我想,我想你想,我想,我想,很不幸,不幸,那个不匹配的,看到不幸,不幸,那个不匹配的。不幸,不幸,不幸,那个不匹配的。不幸,那个不匹配的,那个不匹配的:<代码>{{{{{{{翻译这翻译这翻译,翻译这,翻译这翻译,和翻译,和{{{{{{{{{{{{{{{{{{{{{{{{日日{日日日日日日,日,日日,日,日,日,日,日,日,日,日,日。翻译。翻译。翻译。翻译。翻译。翻译。翻译。翻译。翻译。翻译。翻译。翻译。}第二个
{{name}}
{{bool}}
字符串:(不,这是不必要的,因为您应该运行正则表达式替换,直到没有匹配为止(在循环中,
而(preg_match($thePatternAbove,$text)){…
)。一旦你替换了最里面的部分,你就可以匹配最外面的部分。这是个好主意,但是它仍然不匹配这个模式(事实上,它不匹配这个模式中的任何东西):
{{{func.Translate}翻译这个,和{{func.Translate}分别翻译这个{{name}{{/func.Translate}{func.Translate}{/func.Translate}}
只需确保模式匹配,我不太符合要求。我认为您需要类似于
/{{{{s*([^{}]*?)\s*}((?:(?!{)。*?){{\/\s*\1\s*}/s
,不幸的是,这与:
{{func.Translate}}翻译这个,然后{{{func.Translate func.Translate name}{{{{bool}{{/func.Translate}}
第二个
{{name}}
{bool}}
字符串。:(不,这是不必要的,因为您应该运行正则表达式替换,直到没有匹配为止(在循环中,
而(preg_match($thePatternAbove,$text)){…
)。一旦你替换了最里面的部分,你就可以匹配最外面的部分。这是个好主意,但是它仍然不匹配这个模式(事实上,它不匹配这个模式中的任何东西):
{{{func.Translate}翻译这个,和{{func.Translate}分别翻译这个{{name}{{/func.Translate}{func.Translate}{/func.Translate}}
只需确保模式匹配,我不太了解需求。