0

0

php怎么实现搜索高亮_php关键词匹配并加亮显示【检索】

尼克

尼克

发布时间:2026-02-21 19:01:03

|

274人浏览过

|

来源于php中文网

原创

preg_replace是最稳妥的关键词高亮方式,需转义关键词、加i修饰符、用$0替换、中文需归一化空白、先htmlspecialchars再高亮、多词按长度降序处理。

php怎么实现搜索高亮_php关键词匹配并加亮显示【检索】

preg_replace 是最稳妥的关键词高亮方式

直接用 str_replace 看似简单,但大小写不敏感、无法处理“php”和“phpstorm”重叠匹配、还可能把 HTML 标签里的内容也误替换(比如把 <span></span> 里的 “pan” 高亮)。preg_replace 能真正按“词”匹配,可控性强。

  • 必须用 preg_quote($keyword, '/') 转义用户输入,否则关键词含 .+[ 就会崩正则
  • i 修饰符实现不区分大小写,模式写成 '/'.preg_quote($kw, '/').'/'.'i'
  • 替换内容用 '<mark>$0</mark>'$0 表示完整匹配项,比 $1 更安全(不用捕获组)
  • 如需只匹配独立单词(避免 “stack” 匹配到 “stacking”),加上词边界 \b'/\b'.preg_quote($kw, '/').'\b/i'

中文搜索前必须统一空格和转义

用户可能输全角空格、半角空格、甚至换行符,直接拿去匹配大概率失败。PHP 不像 JS 有 \s 自动覆盖所有空白,得手动归一化。

  • 先用 str_replace([' ', "\r", "\n"], ' ', $keyword) 把全角空格、回车、换行换成普通空格
  • preg_replace('/\s+/', ' ', $keyword) 合并多个连续空格
  • 如果关键词是多个词(如 “人工智能 开源”),拆成数组后逐个高亮,不要拼成一个正则——容易因顺序或边界冲突漏匹配
  • 注意:中文词无天然 \b 边界,\b 对汉字无效;若需“整词”效果,得靠前后字符判断(如用 (? 和 <code>(?!\w)),但多数场景直接去掉 \b 更实际

必须先 htmlspecialchars 再高亮,否则 XSS

用户搜 <script>alert(1)</script>,如果你先替换再转义,<mark></mark> 标签会被当作文本输出,而脚本仍保留在 <p>用户搜 <code><script>alert(1)</script>,如果你先替换再转义,<mark></mark> 标签会被当作文本输出,而脚本仍保留在 $0 里执行——高亮功能直接变成 XSS 入口。

里执行——高亮功能直接变成 XSS 入口。

Cleanup.pictures
Cleanup.pictures

智能移除图片中的物体、文本、污迹、人物或任何不想要的东西

下载
  • 正确顺序:先 htmlspecialchars($text, ENT_QUOTES, 'UTF-8'),再对结果做 preg_replace
  • 别用 htmlentities,它会把中文也转成实体,影响可读性
  • 如果原文已含 HTML(比如富文本内容),不能直接 htmlspecialchars 全文——会把原有标签也转义。此时应先用 DOMDocument 或专用库剥离/保留标签逻辑,再对纯文本部分高亮

多关键词高亮要排序,长词优先

搜 “php” 和 “phpstorm”,如果先替 “php”,后面 “phpstorm” 就变成 “phpstorm”,再替 “phpstorm” 就找不到原串了——高亮被污染。

立即学习PHP免费学习笔记(深入)”;

  • 把关键词数组按长度降序排列:usort($keywords, function($a, $b) { return strlen($b) - strlen($a); });
  • 循环每个词调用 preg_replace,而不是用 | 拼成单个正则(后者无法保证优先级,且 $0 只能取第一个匹配)
  • 如果关键词来自用户输入(如 GET 参数),记得 trim()array_filter() 去掉空值,防止生成 //i 这种非法正则

高亮看着只是加个 <mark></mark>,但关键词来源、HTML 上下文、中文边界、多词顺序这四点没理清,轻则显示错乱,重则执行任意脚本。真正在生产环境用,别省那几行排序和转义。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
phpstorm怎么导出项目
phpstorm怎么导出项目

phpstorm提供导出项目功能,步骤如下:打开phpstorm项目转到“项目”菜单选择“导出项目”选择导出格式指定导出位置选择导出范围勾选“包括依赖项”框(可选)单击“导出”完成导出。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

377

2024.04.08

phpStorm怎么运行
phpStorm怎么运行

本专题整合了phpstorm运行教程,阅读专题下面的文章了解更多相关内容。

87

2025.09.18

phpstorm开发环境搭建教程
phpstorm开发环境搭建教程

本专题整合了phpstorm开发环境搭建和运行项目教程,阅读专题下面的文章了解更多详细教程。

77

2025.09.18

phpstorm怎样运行php
phpstorm怎样运行php

本专题整合了phpstorm运行php相关教程,阅读专题下面的文章了解更多详细内容。

62

2025.09.18

phpstorm相关教程大全
phpstorm相关教程大全

本专题整合了phpstorm相关教程汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.15

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

524

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

454

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

595

2023.08.03

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

916

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号