PHP preg_replace:不区分大小写的匹配和区分大小写的替换

2022-08-30 15:17:45

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

有没有更好的方法来做到这一点?

更新:下面提出的一个很好的查询,为了这个任务的目的,我只想尊重“标题大小写” - 所以一个单词的第一个字母是否是大写的。


答案 1

我为常见情况想到了这个实现:

$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的答案)


答案 2

你可以用 来做这件事,但这更冗长:preg_replace_callback

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

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

此代码仅查看匹配项的第一个字符的大小写,以确定要替换的内容;你可以调整代码来做一些更复杂的事情。


推荐