如何在数组源的缩写后有效地添加字符串?

How can I efficiently add strings after abbreviations from an array source?

我想将美国州名添加到包含美国州缩写的字符串中。

例如,我想转换一个字符串数组,例如:

Lorem ipsum CA dolor NY sit foo bar

至:

Lorem ipsum CA (California) dolor NY (New York) sit any foo bar

假设我的替换数组如下所示:

$states = array(
    "AR" => "Arkansas",
    "CA" => "California",
    "NY" => "New York"
);

一种方法是进行 array_key 搜索:

$input = "Lorem ipsum CA dolor NY sit any foo bar";
$words = explode(' ', $input);
foreach ($words as $key => $word) {
    if (array_key_exists($word, $states)) {
        $words[$k] = $word . " (" . $states[$word] . ")";
    }
}
$output = implode(" ", $words);
// Output: Lorem ipsum CA (California) dolor NY (New York) sit any foo bar

使用本机 PHP 函数或正则表达式是否有更有效的方法?

解决方案不应匹配部分匹配项(例如 any 不应匹配 NYbar 不应匹配 AR)。

您不必拆分单词,只需遍历状态并将短状态替换为新文本即可。

这应该可以完成工作:

$states = array(
    "AR" => "Arkansas",
    "CA" => "California",
    "NY" => "New York"
);

$input = "Lorem ipsum CA dolor NY sit any foo bar";
foreach($states as $shortState=>$longState){
   $input = str_replace($shortState, $shortState." (".$longState.")", $input); 
}
echo $input;
// output: Lorem ipsum CA (California) dolor NY (New York) sit any foo bar

使用 preg_replace_callback function 你可以在没有任何循环的情况下一步完成:

$repl = preg_replace_callback('/\b(' . implode("|", array_keys($states)) . ')\b/',
     function ($m) use($states) { return $m[1] . ' (' . $states[$m[1]] . ')'; }, $input);

//=> Lorem ipsum CA (California) dolor NY (New York) sit any foo bar

代码解释:

  • '/\b(' . implode("|", array_keys($states)) . ')\b/':这里我们使用从数组 $states 中获取的数组键构建一个正则表达式。它将变成: /\b(AR|CA|NY)\b/ 这里。请注意,在此正则表达式的第 1 组中捕获了州缩写。

  • $m[1] . ' (' . $states[$m[1]] . ')'是在州名缩写前加州名

对数组格式稍作更改,您可以将 strtr() 与数组一起使用...

$states = array(
    "AR" => "AR (Arkansas)",
    "CA" => "CA (California)",
    "NY" => "NY (New York)"
);

$text = "Lorem ipsum CA dolor NY sit foo bar";

echo strtr( $text, $states);

给...

Lorem ipsum CA (California) dolor NT (New York) sit foo bar