首页 > 解决方案 > 如何在数组源的缩写后有效地添加字符串?

问题描述

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

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

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 函数或正则表达式?

解决方案不应匹配部分匹配项(例如anyshould not matchNYbarshould not match AR)。

标签: phpregexstr-replace

解决方案


使用preg_replace_callback函数,您可以在没有任何循环的情况下一步完成:

$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/':这里我们正在使用从 array 获取的数组键构建一个正则表达式$states。会变成:/\b(AR|CA|NY)\b/这里。请注意,此正则表达式中的第 1 组中正在捕获状态缩写。

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


推荐阅读