Php 代码点火器和预点火器更换

Php 代码点火器和预点火器更换,php,regex,codeigniter,preg-replace,Php,Regex,Codeigniter,Preg Replace,我使用Codeigniter创建了一个多语言网站,一切正常,但当我尝试使用Luis的“另类语言助手”时,我遇到了一个问题。此帮助程序使用正则表达式将当前语言替换为新语言: $new_uri = preg_replace('/^'.$actual_lang.'/', $lang, $uri); 问题是我有这样一个URL:http://www.example.com/en/language/english/我只想替换第一个“en”而不更改单词“english”。我尝试使用preg\u replac

我使用Codeigniter创建了一个多语言网站,一切正常,但当我尝试使用Luis的“另类语言助手”时,我遇到了一个问题。此帮助程序使用正则表达式将当前语言替换为新语言:

$new_uri = preg_replace('/^'.$actual_lang.'/', $lang, $uri);
问题是我有这样一个URL:
http://www.example.com/en/language/english/
我只想替换第一个“en”而不更改单词“english”。我尝试使用
preg\u replace
的限制:

$new_uri = preg_replace('/^'.$actual_lang.'/', $lang, $uri, 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).

如果您知道URL的开头总是什么,请在正则表达式中使用它

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

$regex='#(?问题中给出的URL仍将与该regex匹配。它仍将匹配,但只有第一个
en
部分。后面的
english/
将不匹配(因此不会被替换)…实际上,我说得太快了。URL根本不会匹配,因为URL不是以en开头的。但是,如果没有
^
锚,
http://www.example.com/en/language/en/
将匹配两次。