2013-10-11 11 views
20

と大文字小文字を区別しないマッチング:PHPのにpreg_replace:私はこのように、検索し、文字列内の特定の単語を置き換えるためにPHPでにpreg_replaceを使用している大文字と小文字が区別交換

結果「梨梨」を与え
$subject = "Apple apple"; 
print preg_replace('/\bapple\b/i', 'pear', $subject); 

私は、大文字小文字を区別しない方法で単語をマッチさせることができますが、置き換えられた場合は敬意を表して結果を「梨の梨」にします。

以下の作品が、少し長い私に息切れ思わ:

$pattern = array('/Apple\b/', '/apple\b/'); 
$replacement = array('Pear', 'pear'); 
$subject = "Apple apple"; 
print preg_replace($pattern, $replacement, $subject); 

はこれを行うには良い方法はありますか?

更新:このタスクの目的のために、以下のような優れたクエリに加えて、単語の最初の文字が大文字であるかどうかにかかわらず、「タイトルケース」を尊重したいだけです。

+0

のように、$1でアクセスすることができます。唯一の不明な点は、置き換え元の単語の長さと元の単語の長さが異なる場合より高い地位の大文字?私。 '' applE''と '' pear''はどうしたの? –

+0

優れた点。この特定の仕事の目的のために、私は「タイトルケース」(最初の文字が首都であるかどうかにかかわらず)を尊重したいだけです。もっと分かりやすくしてくれてありがとう。 – colin

答えて

7

私は心の中で一般的なケースのために、この実装を持っています。もちろん、もっと複雑な

$data = 'this is appLe and ApPle'; 
$search = 'apple'; 
$replace = 'pear'; 

$data = preg_replace_callback('/\b'.$search.'\b/i', function($matches) use ($replace) 
{ 
    $i=0; 
    return join('', array_map(function($char) use ($matches, &$i) 
    { 
     return ctype_lower($matches[0][$i++])?strtolower($char):strtoupper($char); 
    }, str_split($replace))); 
}, $data); 

//var_dump($data); //"this is peaR and PeAr" 

-itの、が、任意の位置のため、元の要求に合います。あなたが最初の文字だけを探しているなら、これはやり過ぎかもしれない(そしてジョンの答え@参照)

10

あなたはpreg_replace_callbackでこれを行うことができ、それは、より長いったらしいです:

$replacer = function($matches) { 
    return ctype_lower($matches[0][0]) ? 'pear' : 'Pear'; 
}; 

print preg_replace_callback('/\bapple\b/i', $replacer, $subject); 

このコードは、ちょうどと交換するかを決定するための一致の最初の文字の大文字小文字を見て。代わりにもっと複雑なことをするためにコードを適応させることができます。

+0

私はあなたのコードを試しましたが、Catchableの致命的なエラーが発生しました:Closureのオブジェクトを文字列に変換できませんでした。 – c3cris

+0

@ c3cris上記のスニペットで 'preg_replace_callback'の代わりに誤って' preg_replace'最初の行に記載されていることが正しいと言いました。一定。 – Jon

+0

これははるかに洗練されたソリューションです。一目で理解するのがずっと短くて簡単です。 +1 – JustCarty

3

これは私が使用したソリューションです:

私はI」ことができる最高の言葉で
$result = preg_replace("/\b(foo)\b/i", "<strong>$1</strong>", $original); 

これがなぜ機能するのか説明してみてください:()で検索用語をラップすると、後でこの値にアクセスしたいということです。正規表現の最初の項目であるため、置換パラメータ

+0

そしてそれと期待される答えの違いを見てください。すべてのエンジニアに「簡単に保つ」ことを思い出させる。 – Meiji

関連する問題