使用php ...
我有一个数组(多维,虽然我只担心这个实例中的顶级),其中键是各种形式的字符串。密钥的示例是;
我需要一个可以删除'Dr','Dr','Dr','博士的功能'只能从找到它们的任何键的开头。我目前正在使用这个...
function fixArrayKey(&$arr) {
$arr = array_combine(
array_map(
function ($str) {
return str_replace(array('Dr. ', 'Dr.', 'Dr ', 'Dr'), '', $str);
},
array_keys($arr)
),
array_values($arr)
);
}
...我在答案How to remove spaces in array keys names in php?
中找到了它几乎让我在那里,但会在字符串中的任何地方进行匹配,所以我最终会结束;
我觉得我需要使用preg_replace(),有点像这个例子Remove a string from the beginning of a string,我想我可以在preg_replace()中设置一个限制,但我不确定。我也看过ltrim(),但这不太对。我的问题是我可能找不到匹配项,或者匹配的长度可能是2个,3个或4个字符,并且可能存在我不想在字符串中间删除的匹配项。
我是否正在使用preg_replace()查找正确的方向?
答案 0 :(得分:2)
你应该能够用这个正则表达式涵盖所有基础。这只是需要更改的return
部分:
return preg_replace('/^Dr\.?\s+/', '', $str);
^
是字符串替换Dr
?
在.
\s+
但是,要消除您当前拥有的所有代码,可以使用:
$array = array_combine(preg_replace('/^Dr\.?\s+/', '', array_keys($array)), $array);
答案 1 :(得分:1)
你是对的,preg_replace
会对你有用,因为你可以使用锚点和单词边界轻松删除整个单词。
使用
return preg_replace('~^Dr\b\.?\s*~', '', $str);
请参阅regex demo。注意我添加了Draco Malfoy
作为附加测试字符串。正则表达式不会在此处删除Dr
。为什么见下文。
<强>详情:
^
- 字符串开头Dr\b
- 整个单词Dr
(\b
为单词边界)\.?
- 一个或零点\s*
- 一个或多个空格。答案 2 :(得分:0)
您可以使用preg_replace
return preg_replace('/(^Dr|Dr\s|Dr.|Dr.\s)/', '',$yourString);
答案 3 :(得分:0)
$names = array(
'Fred Smith' => true,
'Dr John Paul' => true,
'Dr. Mary Ellen' => true,
'Bill Driver' => true,
);
foreach($names as $key => $val) {
$temp_key = strtolower(trim(substr($key, 0, 2)));
if($temp_key == "dr") {
unset($names[$key]);
$names[trim(substr($key, 3))] = $val;
}
}
print_r($names);