2010-08-17 37 views
1

我使用Codeigniter來創建一個多語言網站,一切工作正常,但是當我嘗試使用Luis的「替代語言助手」時,我遇到了問題。這個輔助使用正則表達式用新的替換當前的語言:Codeigniter和preg_replace

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

的問題是,我有一個這樣的URL:http://www.example.com/en/language/english/,我想只替換第一個「」不改變單詞「英文」。我試圖使用preg_replace的限制:

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

但這不適用於我。有任何想法嗎?

回答

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

問題中給出的URL仍然與該正則表達式匹配。 – 2010-08-17 19:04:05

+0

它仍然會匹配,但只有第一個'en'部分。後面的英文/不匹配(因此不會被替換)... – ircmaxell 2010-08-17 19:05:20

+0

其實,我說得太快了。該URL根本不會匹配,因爲該URL不以en開頭。然而,如果沒有'^'錨點,'http:// www.example.com/en/language/en /'會匹配兩次。 – 2010-08-17 19:09:33

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不會匹配)。