2013-01-15 154 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