php - 如何在数组源的缩写后有效地添加字符串?
问题描述
我想将美国州名添加到包含美国州缩写的字符串中。
例如,我想转换一个字符串数组,如:
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
should not matchNY
和bar
should not match AR
)。
解决方案
使用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]] . ')'
在州缩写前面附加州名
推荐阅读
- ruby-on-rails - 如何从 Rails 中的数千条记录中创建唯一数组项列表?
- scala - 使用 UUID.randomUUID().toString 在请求正文中设置键给出问题-scala
- python - python脚本可以将自己的内容输出到另一个文件吗?
- git - 我需要在同一个项目但不同分支的 git lab 上上传 5 个项目
- python - 将字典和一些常量压缩到元组列表中
- javascript - 如何使用 discord.js 向特定成员发送 DM?
- c# - await 不等待休息响应 C# .netCore
- php - 如何模拟使用 PhpUnit 审查另一个模型的一个或多个实例的模型的方法?
- sql-server - SQL SERVER 登录超时,无法连接(OS LINUX SERVER)
- .net - 如何正确测试 Test AuthorizationHandler