2010-08-17 6 views
1

J'utilise Codeigniter pour créer un site Web multilingue et tout fonctionne bien, mais quand j'essaie d'utiliser le "assistant de langues alternatives" de Luis, j'ai un problème. Cette aide utilise une expression régulière pour remplacer le libellé actuel par le nouveau:Codeigniter et preg_replace

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

Le problème est que j'ai une URL comme ceci: http://www.example.com/en/language/english/ et je veux remplacer seulement le premier « en » sans changer le mot "anglais". J'ai essayé d'utiliser la limite pour preg_replace:

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

mais cela ne fonctionne pas pour moi. Des idées?

Répondre

1

Vous pouvez faire quelque chose comme ceci:

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

Le dernier modèle de capture signifie essentiellement « correspondre uniquement si le caractère suivant est une barre oblique ou à la fin de la chaîne » ...

edit:

Si le code que vous voulez toujours remplacer est au début du chemin, vous pouvez toujours faire:

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); 
    } 
} 

C'est un peu plus de code, mais il devrait être assez robuste. Vous pouvez toujours créer une classe pour le faire pour vous (en analysant, en remplaçant puis en reconstruisant l'URL) ...

+1

L'URL indiquée dans la question sera toujours associée à cette expression régulière. –

+0

Il serait encore apparié, mais seulement la première partie 'en'. Le 'anglais /' final ne serait pas apparié (et donc ne serait pas remplacé) ... – ircmaxell

+0

En fait, j'ai parlé trop tôt. L'URL ne sera pas mise en correspondance du tout, car l'URL ne commence pas par en. Sans l'ancre '^', cependant, 'http: // www.example.com/en/language/en /' correspondrait deux fois. –

1

Si vous savez ce que le début de l'URL sera toujours, soyez, utilisez-le dans la regex!

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

Dans le cas de votre exemple, l'expression régulière deviendrait #(?<=^http://www.example.com/)en\b qui correspondrait à en que si elle a suivi le début spécifié d'un domaine ((?<=...) dans une expression régulière spécifie un positive lookbehind) et est suivie d'une word boundary (donc english ne correspond pas).