2010-08-17 4 views
1

Codeigniter를 사용하여 다국어 웹 사이트를 만들고 모든 것이 잘 작동하지만 Luis가 "대체 언어 도우미"를 사용하려고하면 문제가 발생합니다. 이 헬퍼는 새와 현재의 언어를 대체하는 정규 표현식을 사용 http://www.example.com/en/language/english/ 내가 변경하지 않고 첫 번째 " 엉"를 교체하려면 :Codeigniter 및 preg_replace

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

문제는이 같은 URL을 가지고있다 단어 "영어". 나는 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은 여전히 ​​그 정규식과 일치합니다. –

+0

여전히 일치하지만 첫 번째 'en'부분 만 일치합니다. 후행하는'english /'는 일치하지 않을 것이고 따라서 대체되지 않을 것이다 ... – ircmaxell

+0

사실, 나는 너무 빨리 말했다. URL이 en으로 시작하지 않기 때문에 URL이 전혀 일치하지 않습니다. 그러나 '^'앵커가 없으면'http : // www.example.com/en/language/en /'이 두 번 일치합니다. –

1

URL의 시작 부분이 언제나 정규식에서 사용된다는 것을 알고 있다면! 귀하의 예제의 경우

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

, 정규 표현식이 도메인의 지정된 시작 다음 경우에만 en을 일치합니다 #(?<=^http://www.example.com/)en\b 될 것이다 (정규 표현식에 (?<=...) 것은 positive lookbehind를 지정)과 word boundary 뒤에 (따라서 english이 일치하지 않음).