I use Codeigniter to create a multilingual website and everything works fine, but when I try to use the "alternative languages helper" by Luis I've got a problem. This helper uses a regular expression to replace the current language with the new one:
$new_uri = preg_replace('/^'.$actual_lang.'/', $lang, $uri);
The problem is that I have a URL like this: http://www.example.com/en/language/english/
and I want to replace only the first "en" without changing the word "english". I tried to use the limit for preg_replace
:
$new_uri = preg_replace('/^'.$actual_lang.'/', $lang, $uri, 1);
but this doesn't work for me. Any ideas?
Вы можете сделать что-то вроде этого:
$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) ...
Если вы знаете, каким всегда будет начало 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
, только если он следует за указанным началом домена ( (? <= ...)
в регулярном выражении указывает положительный просмотр назад ) и за ним следует слово Граница (поэтому английский
не будет соответствовать).