Codeigniter和preg_replace

时间:2010-08-17 18:54:22

标签: php regex codeigniter preg-replace

我使用Codeigniter创建一个多语言网站,一切正常,但当我尝试使用路易斯的“替代语言助手”时,我遇到了问题。此帮助程序使用正则表达式将当前语言替换为新语言:

$new_uri = preg_replace('/^'.$actual_lang.'/', $lang, $uri);

问题是我有一个这样的网址:http://www.example.com/en/language/english/我只想更换第一个“ en ”而不更改“英文这个词”。我尝试使用preg_replace的限制:

$new_uri = preg_replace('/^'.$actual_lang.'/', $lang, $uri, 1);

但这对我不起作用。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你可以这样做:

$regex = '#^'.preg_quote($actual_lang, '#').'(?=/|$)#';
$new_uri = preg_replace($regex, $lang, $uri);

最后一个捕获模式基本上意味着“只有在下一个字符是正斜杠或字符串结尾时才匹配”...

修改

如果您想要替换的代码位于路径的开头,您可以随时执行:

if (stripos($url, $actual_lang) !== false) {
    if (strpos($url, '://') !== false) {
        $path = parse_url($url, PHP_URL_PATH);
    } else {
        $path = $url;
    }
    list($language, $rest) = explode('/', $path, 2);
    if ($language == $actual_lang) {
        $url = str_replace($path, $lang . '/' . $rest, $url);
    }
}

这是更多的代码,但它应该相当强大。您总是可以构建一个类来为您执行此操作(通过解析,替换然后重新构建URL)...

答案 1 :(得分:1)

如果您知道URL的开头始终是,请在正则表达式中使用它!

$domain = "http://www.example.com/"
$regex = '#(?<=^' . preg_quote($domain, '#') . ')' . preg_quote($actual_lang, '#') . '\b#';
$new_uri = preg_replace($regex, $lang, $uri);

对于您的示例,正​​则表达式将变为#(?<=^http://www.example.com/)en\b,只有当它跟随指定的域开头(en在正则表达式中指定时才会匹配(?<=...) positive lookbehind),然后是word boundary(因此english不匹配)。