You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何仅对正则匹配的特定分组执行替换操作?

需求与问题

我需要在纯文本中搜索关键词和关键短语,通过包裹<span>标签实现高亮效果,这部分功能已实现,但要避免高亮已经处于span标签内的内容。

我找到一个可行的JavaScript实现逻辑,对应代码示例如下:

var subject = 'Red apples are my <span class="highlight">favourite apples.</span>';
var regex = /<span.*?<\/span>|(\bapples\b)/g;
replaced = subject.replace(regex, function(m, group1) {
    if (group1 == "" ) return m;
    else return "<span class=\"highlight\">" + group1 + "</span>";
});
document.write("<br>*** Replacements ***<br>");
document.write(replaced);

但我需要用PHP实现该功能,尝试转换逻辑后写出了以下可运行代码:

$text = 'Red apples are my <span class="highlight">favourite fruit.</span> <span class="highlight">Red apples are my favourite fruit.</span> I love red apples.';
$pattern = '/<span.*?<\/span>|(\bapples\b)/i';

preg_match_all($pattern, $text, $matches);

print_r($matches[0]);
print_r($matches[1]);

代码输出结果:

Array ( [0] => apples [1] => favourite fruit. [2] => Red apples are my favourite fruit. [3] => apples ) 
Array ( [0] => apples [1] => [2] => [3] => apples )

能看出正则表达式有效,但我无法像JavaScript示例那样,仅对第二个分组执行替换操作。希望有人帮忙将上述JavaScript示例转换为可运行的PHP代码,同时让我学习更多PHP正则函数的用法。


解决方案

感谢@SashaKondrashov提供的可行方案:

$text = 'Red apples are my <span class="highlight">favourite fruit.</span> <span class="highlight">Red apples are my favourite fruit.</span> I love red apples.';
$pattern = '/<span.*?<\/span>|(\bapples\b)/i';
    
$result = preg_replace_callback($pattern, function ($matches) {
    if (count($matches) == 1) return $matches[0];
    return "<span>{$matches[1]}</span>";
}, $text);
    
print_r($result);

内容的提问来源于stack exchange,提问作者kjaer108

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 20:38:16