Цикл '{en:} hello {nl:} hoi' с помощью preg_match - PullRequest
2 голосов
/ 08 марта 2011

Я работаю над функцией перевода, которая должна работать следующим образом: _ ('{en:} hello {nl:} hoi') Но у меня проблемы с написанием правильного регулярного выражения.Пока у меня есть этот код:

preg_match('/\{([a-zA-Z_]{2,4}):\}(.*)/', $translate, $matches);

for ($i = 0; $i < count($matches) / 2; $i + 2)
{
    $return .= '<!--:' . $matches[$i] . '-->' . $matches[$i + 1] . '<!--:-->';
}

Но мой массив совпадений содержит:

array
  0 => string '{en:}hello{nl:}hoi' (length=23)
  1 => string 'en' (length=2)
  2 => string 'hello{nl:}hoi' (length=18)

Есть идеи для правильного регулярного выражения?Или даже лучший способ решить это?

Ответы [ 2 ]

1 голос
/ 11 мая 2011

Я не совсем уверен, что должна возвращать функция, поэтому следующая функция вернет ассоциативный массив с языком в качестве ключей и текстом в качестве значений:

function _($translate)
{
    $result = array();
    if (preg_match_all('/\{(.+?):\}([^{]+)/', $translate, $matches))
    {
        for ($i = 0, $len = count($matches[0]); $i < $len; ++$i)
        {
            $result[$matches[1][$i]] = $matches[2][$i];
        }
    }
    return $result;
}

Пример:

print_r(_('{en:}hello{nl:}hoi'));

Приведенный выше пример выдаст:

Array
(
    [en] => hello
    [nl] => hoi
)
0 голосов
/ 08 марта 2011

Я думаю, вы хотите изменить (. *), Чтобы он не соответствовал символу {:

/\{([a-zA-Z_]{2,4}):\}([^{]*)/
...