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
相关产品推荐
相关产品推荐

