2017-02-01 6 views
3

の唯一の始まりからキーは、さまざまなを取る文字列であるところ(私はこの例では、トップレベルについての唯一の心配のに多次元)私は配列を持っている... PHPを使用して配列のキー

を潜在的な文字を削除しますフォームの。キーの例は次のとおりです。

  • フレッド・スミス
  • ドクター・ジョン・ポール
  • 博士メアリー・エレン
  • ビル・ドライバ

私は、 '博士'、 '博士' '博士' を削除する関数を必要とします、 'Dr.キーが見つかった場所のどこかで始まります。私は現在...私はそれはほとんどそこに私を取得している、ここでの回答How to remove spaces in array keys names in php?

で見つかった

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) 
); 

}

を...これを使用していますが、どこかで試合に作用します文字列、私は結局終わります。

アイバー

  • フレッド・スミス
  • ヨハネ・パウロ
  • メアリー・エレン
  • ビル、私は私が(にpreg_replaceを使用して検討する必要があり気持ちを持っている)、ややこの例Remove a string from the beginning of a string様およびI私はpreg_replace()の制限を設定することができますが、私はよくわからないと思う。私もltrim()を見てきましたが、それは正しくありません。私の問題は、一致するものが見つからないか、2,3,4文字の長さの一致があり、文字列の途中で削除したくないものがある可能性があるということです。

    私はpreg_replace()で正しい方向を見ていますか?

+0

'preg_replace( '〜^ Dr \。?\ s *〜'、 ''、$ str)' –

+0

'preg_replace( '〜^ Dr \ b \。?\ s *〜 '、' '、$ str) 'が良いでしょう。 –

+0

私は説明付きで答えを加えました。 –

答えて

2

この正規表現ですべての塩基をカバーできるはずです。文字列の先頭は、必要に応じて?

  • Drを交換
  • 後1つの以上のスペース \s+を交換し .後に置き換える

    return preg_replace('/^Dr\.?\s+/', '', $str); 
    
    • ^がある:これは変更する必要がある唯一のreturn部分であり、

    しかし、あなたが必要とするすべてのコードを削除するにはntlyあなたが使用することができ、持っている:

    $array = array_combine(preg_replace('/^Dr\.?\s+/', '', array_keys($array)), $array); 
    
    +0

    2番目の '?'では、Draco、Drake、Dreyfusなどのファーストネームでのマッチングのリスクがあります。 '* 'の代わりに' 1つ以上の 'スペースの' + 'に置き換えます。 –

    +0

    はい、私はそれをします。私はOPが最初に持っていたことにちょうど従っていた。 – AbraCadaver

    +0

    ワンライナーは使えませんが、私はそれを困惑させます。 preg_replaceでのリターンは機能しますが、余分な丸いブレースがあります。それはpreg_replace( '/^Dr \。?\ s + /'、 ''、$ str)でなければなりません。 – verdonv

    0

    あなたはあなたが正しいにpreg_replace

    return preg_replace('/(^Dr|Dr\s|Dr.|Dr.\s)/', '',$yourString); 
    
    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); 
    
    1

    を使用することができ、簡単にアンカーを使用して単語全体を削除することができますよう、preg_replaceはあなたのために動作します単語の境界。

    使用

    return preg_replace('~^Dr\b\.?\s*~', '', $str); 
    

    regex demoを参照してください。注:追加のテスト文字列としてDraco Malfoyを追加しました。正規表現はここでDrを削除しません。なぜ以下を参照してください。

    詳細

    • ^ - ストリング
    • Dr\bの開始 - 1または0点
    • \s* - 単語全体Dr
    • \.?\bとしては、ワード境界です)、 - 1つ以上の空白。
    +0

    私は単語境界マーカーが好きです。私はそれを知らなかった。この表現はうまくいきますし、上のものもそうです。 – verdonv

    +0

    しかし、 'Draco Malfoy'でテストすれば、あなたはその違いを感じるでしょう。私は、他のすべてのソリューションでは、*単語全体が一致するだけであることを確認していないと思います。 –

    +0

    私はこれでテストしました '/^Dr \。\ s +/'を@AbraCadaverから削除しても、Draco Malfoyを使ってもOKです。正規表現は非常にエレガントです:-) – verdonv

    関連する問題