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's answer then)

于 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 回答