我使用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);
但这对我不起作用。有什么想法吗?
答案 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
不匹配)。