27

次のように、PHP で preg_replace を使用して、文字列内の特定の単語を検索して置換しています。

$subject = "Apple apple";
print preg_replace('/\bapple\b/i', 'pear', $subject);

結果は 'pear pear' になります。

私ができるようにしたいのは、大文字と小文字を区別しない方法で単語を一致させることですが、置換時に大文字と小文字を区別することです。結果は「ナシナシ」になります。

以下はうまくいきますが、私には少し長いようです:

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

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

更新: 以下で提起された優れたクエリに加えて、このタスクの目的のために、「タイトルケース」のみを尊重したいので、単語の最初の文字が大文字であるかどうかに関係なく.

4

4 に答える 4

16

一般的なケースのこの実装を念頭に置いています:

$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"

-もちろん、より複雑ですが、元の要求にどのような位置にも適合します。最初の文字だけを探している場合、これはやり過ぎになる可能性があります(@Jonの回答を参照してください)

于 2013-10-11T12:09:33.797 に答える
11

でこれを行うこともできますがpreg_replace_callback、それはさらに長くなります。

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

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

このコードは、一致する最初の文字の大文字化を調べて、何を置き換えるかを決定します。代わりに、より複雑なことを行うようにコードを調整できます。

于 2013-10-11T11:57:54.913 に答える
8

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

$result = preg_replace("/\b(foo)\b/i", "<strong>$1</strong>", $original);

なぜこれが機能するのかを、できる限り簡単に説明します。検索語を でラップすると、()後でこの値にアクセスしたいという意味になります。これは RegEx の pars の最初の項目であるため$1、置換パラメーターでわかるように、でアクセスできます。

于 2016-10-02T21:59:49.277 に答える
0
$text = 'Grey, grey and grey';
$text = Find_and_replace_in_lowercase_and_uppercase('grey', 'gray', $text);
echo $text; //Returns 'Gray, gray and gray'

function Find_and_replace_in_lowercase_and_uppercase($find_term, $replace_term, $text)
{
        $text = Find_and_replace_in_lowercase($find_term, $replace_term, $text);
        $text = Find_and_replace_in_uppercase($find_term, $replace_term, $text);
        return $text;

}
function Find_and_replace_in_lowercase($find_term, $replace_term, $text)
{
        $find_term = lcfirst($find_term);
        $replace_term = lcfirst($replace_term);
        $text = preg_replace("/$find_term/",$replace_term,$text);
        return $text;
}
function Find_and_replace_in_uppercase($find_term, $replace_term, $text)
{
        $find_term = ucfirst($find_term);
        $replace_term = ucfirst($replace_term);
        $text = preg_replace("/$find_term/",$replace_term,$text);
        return $text;
}
于 2021-11-25T15:13:10.650 に答える