2013-01-15 210 views
3

我試圖用str_replace將兩個字母的語言縮寫轉換爲完整的單詞。 我遇到的問題是它們在回聲時互相影響。str_replace干擾

$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

上面的列表較大,但這只是一個例子。我嘗試重命名變種,但沒有運氣。

+0

$ lang包含什麼?請發佈一小段代碼 –

+3

您將對每個結果重複執行str_replace。 – cgTag

+1

@Wololo $ lang將是一個兩個字母的單詞。示例en英文 – 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:有人釘了它,而有人......是_you_。 –

+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你的陣列的鍵和通作爲第二個參數的分隔符。

+0

@DanielO:檢查你的日誌 - 什麼是真正的錯誤? – Ryan

+0

+1使用正則表達式。 – cgTag

+0

你真的不需要這個正則表達式。使用回調也很慢。 –

0

除非你想到的東西像ensppt爲原始值,只需使用一個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永遠是兩個字符串,沒有必要對查找/替換所有,只使用一個查找表是這樣的:

$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" 
); 

使用str_replace函數:

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

你爲什麼用'{..}'圍住鑰匙?什麼是$條目?你可以編輯澄清? – Alex