Codeigniter и preg_replace - PullRequest
       10

Codeigniter и preg_replace

1 голос
/ 17 августа 2010

Я использую Codeigniter для создания многоязычного веб-сайта, и все работает отлично, но когда я пытаюсь использовать «помощника по альтернативным языкам» Луиса, у меня возникает проблема. Этот помощник использует регулярное выражение для замены текущего языка новым:

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

Проблема в том, что у меня есть такой URL: http://www.example.com/en/language/english/, и я хочу заменить только первый " en ", не меняя слова " english ". Я пытался использовать предел для preg_replace:

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

но это не работает для меня. Есть идеи?

Ответы [ 2 ]

1 голос
/ 17 августа 2010

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

1 голос
/ 17 августа 2010

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

$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) ...

...