2013-01-15 2 views
3

str_replace을 사용하여 두 단어의 언어 약어를 전체 단어로 변환하려고합니다. 내가 가지고있는 문제는 그들이 에코 될 때 서로 영향을주고 있다는 것입니다. str_replace interference

$lang = str_replace("en", "English", $lang); 
$lang = str_replace("es", "Spanish", $lang); 
$lang = str_replace("pt", "Portuguese", $lang); 
$lang = str_replace("fr", "French", $lang); 
$lang = str_replace("de", "German", $lang); 
$lang = str_replace("it", "Italian", $lang); 
$lang = str_replace("pl", "Polish", $lang); 
$lang = str_replace("ru", "Russian", $lang); 
$lang = str_replace("sv", "Spanish (El Salvador)", $lang); 
$lang = str_replace("ko", "Korean", $lang); 
$lang = str_replace("zh", "Chinese", $lang); 
$lang = str_replace("nl", "Dutch", $lang); 

: 나는 en을 에코 때, 나는 EnglIcelandich를 얻을.

위 목록은 더 크지 만 그 예일뿐입니다. 나는 vars의 이름 바꾸기를 시도했지만 운이 없었습니다.

+0

$ lang에는 무엇이 있습니까? 작은 스 니펫을 게시하십시오 –

+3

각 결과에 대해 str_replace를 반복적으로 수행하고 있습니다. – cgTag

+1

@Wololo $ lang은 두 글자로 표시됩니다. 예를 들어, 영어 – chillers

답변

7

간단합니다! 대신 strtr을 사용하십시오.

<?php 
$replace = array(
    "en" => "English", 
    "es" => "Spanish", 
    "pt" => "Portuguese", 
    "fr" => "French", 
    "de" => "German", 
    "it" => "Italian", 
    "pl" => "Polish", 
    "ru" => "Russian", 
    "sv" => "Spanish (El Salvador)", 
    "ko" => "Korean", 
    "zh" => "Chinese", 
    "nl" => "Dutch" 
); 

echo strtr("en it sv\n", $replace); 
+0

+1 : 누군가가 그것을 못 박았으며, 누군가는 ... 당신입니다. –

+0

오, 좋습니다. 나는 항상'strtr'이 어떤 이유에서든 하나의 문자 만 만들었다 고 생각했습니다 : P – Ryan

+0

그런 식으로도 그렇게합니다. 이상합니다. –

2

당신은 한 번 preg_replace_callback를 사용하여 한 번에 모두 수행 할 수 있습니다 귀하의 문자열 중 하나가 지금 그들에 특수 문자가있는 경우

$map = array(
    'en' => 'English', 
    ... 
); 

$lang = preg_replace_callback('/' . implode('|', array_keys($map)) . '/', function($match) use ($map) { 
    return $map[$match[0]]; 
}, $lang); 

아, 그리고, 당신은 당신의 배열의 키와 패스에 preg_quote를 매핑해야합니다 구분 기호는 두 번째 인수로 사용됩니다. 당신이 원래의 값으로 ensppt 같은 것들을 기대하지 않는

+0

@DanielO : 로그 확인 - 실제 오류는 무엇입니까? – Ryan

+0

+1 정규식을 사용합니다. – cgTag

+0

정말이 정규식이 필요하지 않습니다. 또한 콜백을 사용하는 것은 느립니다. –

0

, 단지 mimic'd 룩업 테이블 사용 또는

$lang_lookup = array(
    'en' => 'English', 
    'es' => 'Spanish', 
    'pt' => 'Portuguese', 
    // ... 
); 
$lang = array_key_exists($lang, $lang_lookup) ? $lang_lookup[$lang] : 'Unknown'; 

을 (하지만 느린) 당신이 다른 하나의 문자열을 복사 할 수 있습니다 :

$lang_lookup = array(
    'en'=>'English', 
    'es'=>'Spanish', 
    'pt'=>'Portuguese', 
    'fr'=>'French', 
    'de'=>'German', 
    'it'=>'Italian', 
    'pl'=>'Polish', 
    'ru'=>'Russian', 
    'sv'=>'Spanish (El Salvador)', 
    'ko'=>'Korean', 
    'zh'=>'Chinese', 
    'nl'=>'Dutch' 
); 
$lang = 'es stands for Spanish'; 

$output = ''; 
for ($i = 0; $i < strlen($lang); $i++){ 
    $l = substr($lang, $i, 2); 
    if (array_key_exists($l, $lang_lookup)){ 
    $output .= $lang_lookup[$l]; 
    $i++; 
    } else { 
    $output .= $lang[$i]; 
    } 
} 
echo $output; // "Spanish stands for Spanish" 
+0

이미 거기에 어떤 결과가 있는지 알 수 없습니다. – chillers

+0

@DanielO : 네, 왜냐하면'array_key_exists'를 통해'in_array'를 사용하기 때문입니다. 지금 해봐. –

0

문자열에 하나의 어커런스 만 지원되는 경우 먼저 존재하는 것이 있는지 확인하십시오. 찾아보기 테이블로 배열 사용하기.

$languages = array(
    'en'=>'English' 
    'es'=>'Spanish' 
    'pt'=>'Portuguese' 
    'fr'=>'French' 
    'de'=>'German' 
    'it'=>'Italian' 
    'pl'=>'Polish' 
    'ru'=>'Russian' 
    'sv'=>'Spanish (El Salvador)' 
    'ko'=>'Korean' 
    'zh'=>'Chinese' 
    'nl'=>'Dutch' 
); 

foreach($languages as $key=>$value) 
{ 
    if(strpos($lang,$key) !== false) 
    { 
     $lang = str_replace($key,$value,$lang); 
     break; 
    } 
} 
1

$lang 경우 항상 두 개의 문자열이 될 것입니다, 검색에 대한 필요가 없습니다/모두, 그냥이 같은 룩업 테이블을 사용 바꾸 않는 str_replace를 사용

$languages = array(
    'en'=>'English' 
    'es'=>'Spanish' 
    'pt'=>'Portuguese' 
    'fr'=>'French' 
    'de'=>'German' 
    'it'=>'Italian' 
    'pl'=>'Polish' 
    'ru'=>'Russian' 
    'sv'=>'Spanish (El Salvador)' 
    'ko'=>'Korean' 
    'zh'=>'Chinese' 
    'nl'=>'Dutch' 
); 
$lang = $languages[strtolower($lang)]; 
-1
$entries = array(
    "en" => "English", 
    "es" => "Spanish", 
    "pt" => "Portuguese", 
    "fr" => "French", 
    "de" => "German", 
    "it" => "Italian", 
    "pl" => "Polish", 
    "ru" => "Russian", 
    "sv" => "Spanish (El Salvador)", 
    "ko" => "Korean", 
    "zh" => "Chinese", 
    "nl" => "Dutch" 
); 

을 :

for ($i = 0 ; $i < $entries['count']; $i++) { 
    foreach($entries[$i] as $key => $entrie) { 
     if (is_string($key)) { 
     $result = str_replace('{'.$key.'}', $entrie[0], $result); 
     } 
    } 

    $contact_data[] = $result; 
} 
+0

왜 키를'{..} '로 둘러싸고 있습니까? '$ entries'는 무엇입니까? 명확하게 편집 할 수 있습니까? – Alex