2010-08-17 32 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不会匹配)。