Codeigniter and preg_replace

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?

1
задан Daniel Vandersluis 17 August 2010 в 19:02
поделиться

2 ответа

Вы можете сделать что-то вроде этого:

$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
ответ дан 2 September 2019 в 22:04
поделиться

Если вы знаете, каким всегда будет начало 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 , только если он следует за указанным началом домена ( (? <= ...) в регулярном выражении указывает положительный просмотр назад ) и за ним следует слово Граница (поэтому английский не будет соответствовать).

1
ответ дан 2 September 2019 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: