如何在数组源的缩写后有效地添加字符串?
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
不应匹配 NY
,bar
不应匹配 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
我想将美国州名添加到包含美国州缩写的字符串中。
例如,我想转换一个字符串数组,例如:
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
不应匹配 NY
,bar
不应匹配 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