从数组键的开头删除潜在的字符

时间:2017-02-01 20:31:20

标签: php arrays regex loops

使用php ...

我有一个数组(多维,虽然我只担心这个实例中的顶级),其中键是各种形式的字符串。密钥的示例是;

  • Fred Smith
  • John Paul博士
  • 博士。玛丽艾伦
  • Bill Driver

我需要一个可以删除'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?

中找到了

它几乎让我在那里,但会在字符串中的任何地方进行匹配,所以我最终会结束;

  • Fred Smith
  • John Paul
  • Mary Ellen
  • Bill iver

我觉得我需要使用preg_replace(),有点像这个例子Remove a string from the beginning of a string,我想我可以在preg_replace()中设置一个限制,但我不确定。我也看过ltrim(),但这不太对。我的问题是我可能找不到匹配项,或者匹配的长度可能是2个,3个或4个字符,并且可能存在我不想在字符串中间删除的匹配项。

我是否正在使用preg_replace()查找正确的方向?

4 个答案:

答案 0 :(得分:2)

你应该能够用这个正则表达式涵盖所有基础。这只是需要更改的return部分:

return preg_replace('/^Dr\.?\s+/', '', $str);
  • ^是字符串替换Dr
  • 的开头
  • 可选?
  • 之后替换.
  • 之后替换1个或多个空格\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);