ThinkPHP6中字符串搜索分PHP层处理与数据库模糊查询两类:PHP层推荐Str::contains()判断子串,数据库层用where('field','like','%关键词%')并过滤用户输入,避免全表扫描。

在 ThinkPHP(以 TP6 为例)中使用 PHP 7.4 进行字符串搜索,核心仍是 PHP 原生的字符串函数,ThinkPHP 本身不封装字符串搜索逻辑,但提供了更安全、更便捷的数据处理方式(比如输入过滤、模型字段匹配、查询构造等)。关键在于:**明确搜索场景——是 PHP 层字符串处理?还是数据库中的模糊查询?**
一、PHP 层字符串搜索(原生函数 + ThinkPHP 辅助)
适用于对已获取的字符串变量做判断或提取,比如检查用户输入是否包含敏感词、解析日志内容等。
- 用 strpos() 判断子串是否存在(注意返回 0 和 false 的区别):
<?php
$content = '订单已发货,请注意查收';
if (false !== strpos($content, '发货')) {
// 匹配成功
}
?>
- ThinkPHP 提供 Str::contains()(TP6+)简化写法,更语义化且自动处理类型:
<?php
use think\helper\Str;
if (Str::contains($content, '发货')) {
// ✅ 推荐,可读性强,兼容空值
}
?>
立即学习“PHP免费学习笔记(深入)”;
- 区分大小写?用 stripos() 或 Str::contains($str, $search, true)(第三个参数为 true 表示忽略大小写)
- 多关键词搜索?可组合 array_filter() + Str::contains():
$keywords = ['发货', '签收', '退款'];
$matches = array_filter($keywords, function($kw) use ($content) {
return Str::contains($content, $kw);
});
二、数据库模糊查询(最常见需求)
多数“字符串搜索”实际是要从数据库查出含某关键词的记录,这时应交给数据库完成,而不是 PHP 拉全量再搜索。
- 使用 where('field', 'like', '%关键词%') 实现模糊匹配:
Db::name('order')->where('remark', 'like', '%发货%')->select();
- ThinkPHP 6 支持更简洁的闭包写法:
OrderModel::where(function ($query) {
$query->where('title', 'like', '%发票%')
.orWhere('remark', 'like', '%发票%');
})->select();
- 防止 SQL 注入:务必对用户输入做过滤。ThinkPHP 默认开启参数绑定,但手动拼接 like 值时需用 input() 或 filter:
$keyword = input('keyword/s', ''); // /s 表示字符串过滤(去空格、转义)
if ($keyword) {
Db::name('article')->where('title', 'like', "%{$keyword}%")->select();
}
三、中文分词或高级搜索(非原生支持,需扩展)
PHP 7.4 原生不支持中文分词,若需“智能搜索”(如搜索“苹果手机”也能匹配“iPhone”),需引入第三方工具:
- 简单方案:用 scws(开源中文分词库)+ MySQL 全文索引(仅 MyISAM/InnoDB 支持)
- 实用方案:对接 Elasticsearch 或 Solr(适合中大型项目)
- 轻量替代:用 think-sphinx 扩展(基于 Sphinx 搜索引擎)
⚠️ 注意:这些不属于 ThinkPHP 内置能力,需单独安装配置,PHP 7.4 兼容性良好,但要注意扩展版本匹配。
四、性能与安全提醒
字符串搜索看似简单,但线上易踩坑:
- 避免在大文本字段(如 TEXT)上用
LIKE '%关键词%'—— 会全表扫描,无索引加速 - 敏感词检测别只靠前端 JS,PHP 层必须校验;建议预加载词库到内存(Redis 缓存),不用每次读文件
- ThinkPHP 的 validate 规则可配合正则(
regex:/^[\x{4e00}-\x{9fa5}a-zA-Z0-9_]+$/u)限制中文+字母数字 - PHP 7.4 的 箭头函数 和 null 合并赋值(??=) 可让搜索逻辑更简洁,例如:
$search = $search ??= input('s', '');



















