Прежде чем мы использовали 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");
, которая была бы переведено на венгерский язык
Добавить точку зрения% 0
Тогда параметр% 0 был бы заменен моим именем, которое было введено для второго параметра в function.
Я пытался сделать что-то схожее с 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);
}
Для базового использования c, это работает хорошо, но если я попытаюсь перевести что-то внутри перевода, например:
{{# func.Translate }} Translate this, and {{# func.Translate }} translate this separately {{/ func.Translate }} {{/ func.Translate }}
i Я получаю ошибки, потому что мой сопоставитель регулярных выражений будет сопоставлять каждый внутренний тег усов отдельно.
Он соответствует: {{# func.Translate }}
и {{/ func.Translate }}
вместо соответствия {{# func.Translate }} translate this separately {{/ func.Translate }}
.
Моя проблема в том, что я новичок, когда дело доходит до регулярных выражений, и я не могу понять, как можно сопоставить с одним preg_match
как простые mustache
выражения ({{variable}}
), так и более сложные, как в пример. Может ли кто-нибудь помочь мне, пожалуйста?