Preg соответствия усам лямбды и другие "сложные" переменные усов - PullRequest
1 голос
/ 07 февраля 2020

Прежде чем мы использовали 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}}), так и более сложные, как в пример. Может ли кто-нибудь помочь мне, пожалуйста?

...