str_replace干扰问题

3

我试图使用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时,我得到的是英格兰冰岛语
上面的列表更长,但那只是一个例子。我尝试过重命名变量,但没有成功。

$lang 包含什么?请发布一个小片段。 - Hamed Al-Khabaz
3
您一直在对每个结果执行 str_replace 操作。 - Reactgular
1
@Wololo $lang 将是一个两个字母的单词。例如,en 表示英语。 - chillers
你每次都在重写$lang变量。怎么可能会有"en"呢? - Hamed Al-Khabaz
只是因为“EnglIcelandich”有点有趣,所以加上了+1。 - Lightness Races in Orbit
6个回答

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

哦,这样就好了。我一直以为 strtr 只能处理单个字符,不知道为什么会这样想 :P - Ry-
总感觉有点这样。很奇怪。 - Lightness Races in Orbit
1
这就是 PHP,一个函数两用 :s - Arnold Daniels
+1 对于向我展示了一个我以前从未听说过的字符串函数。 - Reactgular
1
我立即设法让这个程序正确运行,并且它很好地运作了,现在我明白我做错了什么。谢谢你! - chillers

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映射到数组键并将分隔符作为其第二个参数传递。


你真的不需要使用正则表达式来完成这个任务。而且使用回调函数会很慢。 - Arnold Daniels
如果你不需要使用正则表达式,但还是用了它,那么我会给你一个比喻性的负分。如果你能够规范化代码,那么我会给你一个加分,因为我并不是那么残忍。 - Lightness Races in Orbit
1
@LightnessRacesinOrbit:我保证我想到了*strtr*,但当我记得它只能处理单个字符时,我就放弃了它! :) - Ry-

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)];

0
除非您期望像ensppt这样的原始值,否则请使用模拟查找表:
$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"

@DanielO:是的,因为我使用in_array而不是array_key_exists。现在试试看。 - Brad Christie

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
$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;
}

你为什么要用 {..} 包围这个键?$entries 是什么?你能编辑一下以澄清吗? - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接