Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP preg_replace:区分大小写的匹配与区分大小写的替换_Php_Regex_Preg Replace - Fatal编程技术网

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

PHP preg_replace:区分大小写的匹配与区分大小写的替换,php,regex,preg-replace,Php,Regex,Preg Replace,我在PHP中使用preg_replace查找并替换字符串中的特定单词,如下所示: $subject = "Apple apple"; print preg_replace('/\bapple\b/i', 'pear', $subject); 结果是“梨” 我希望能够以不区分大小写的方式匹配一个单词,但是当它被替换时,请尊重它的大小写-给出“Pear Pear”的结果 以下内容很有用,但对我来说似乎有点冗长: $pattern = array('/Apple\b/', '/apple\b/');

我在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);
有更好的方法吗


更新:除了下面提出的一个很好的问题之外,为了完成这项任务,我只想考虑“标题大小写”——因此一个单词的第一个字母是否是大写。

您可以使用
preg\u replace\u callback
来完成这项工作,但这更冗长了:

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

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

这段代码只查看匹配的第一个字符的大小写,以确定替换为什么;您可以修改代码来做一些更复杂的事情。

我认为这种实现适用于常见情况:

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

这是我使用的解决方案:

$result = preg_replace("/\b(foo)\b/i", "<strong>$1</strong>", $original);
$result=preg\u replace(“/\b(foo)\b/i”,“$1”,$original);

用我能说的最好的话,我将尝试解释为什么这样做:用
()
包装您的搜索词意味着我希望以后访问此值。由于它是正则表达式中PAR中的第一项,因此可以使用
$1
访问它,正如您在替换参数中所看到的那样,唯一尚不清楚的是:如果替换词和原始词的长度不同,而原始词的大写字母位置较高,该怎么办?也就是说,
'applE'
'pear'
然后呢?很好。为了完成这项特殊任务,我只想尊重“title case”(所以不管第一个字母是否大写)。非常感谢您进一步澄清。我尝试了您的代码,但我发现了一个可捕获的致命错误:类闭包的对象无法转换为字符串…@c3cris我错误地编写了上面代码段中的
preg\u replace
而不是
preg\u replace\u callback
,尽管第一行中提到的内容是正确的。修正。这是一个更优雅的解决方案。简明扼要,一目了然+1然后看看这与预期答案之间的差异。这是对所有工程师的一个很好的提醒,提醒他们“保持简单”。这个答案无法提供预期的结果/功能。太简单了!我怎么会忘了往回看呢?非常感谢。