使用preg_match通过'{en:} hello {nl:} hoi'循环

时间:2011-03-07 22:21:43

标签: php regex translation preg-match

我正在研究一个应该这样工作的翻译函数:_('{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 个答案:

答案 0 :(得分:1)

我不确定该函数应返回什么,因此以下函数将返回一个关联数组,其中语言为键,文本为值:

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
)

答案 1 :(得分:0)

我认为您要更改(。*)以使其与字符{不匹配:

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