如何结合SELECT与LOCATE实现违禁词匹配及字符串包含检测?
违禁词检测组合查询方案
可以通过一条SQL查询同时实现两种检测逻辑:一是用户输入的词(或相似片段)匹配违禁词表中的条目,二是违禁词表中的词作为子串存在于用户输入里。以下是具体实现:
核心组合查询
用OR连接两种判断条件,结合LIKE和LOCATE()函数:
SELECT ID, Word FROM profanities WHERE Word LIKE CONCAT('%', '$user_input', '%') -- 检测输入词是否是违禁词的一部分(比如输入"ana"匹配"Banana") OR LOCATE(Word, '$user_input') > 0; -- 检测违禁词是否包含在输入词中(比如输入"AllBananas"匹配"Banana")
逻辑说明
- 第一个条件
Word LIKE CONCAT('%', '$user_input', '%'):对应你需要的“输入词(或相似词)是否存在于违禁词表”的检测,比如用户输入“Pine”会匹配到“Pineapple”; - 第二个条件
LOCATE(Word, '$user_input') > 0:只要违禁词是用户输入的子串,就会被匹配,比如输入“BananaMelon”会同时命中“Banana”和“Melon”; - 注意:必须对
$user_input做SQL注入防护,比如使用预编译语句,不要直接拼接字符串到SQL中。
可选优化:忽略大小写
如果需要不区分大小写检测(比如输入“banana”也能匹配“Banana”),可以用LOWER()统一转换字符大小写:
SELECT ID, Word FROM profanities WHERE LOWER(Word) LIKE CONCAT('%', LOWER('$user_input'), '%') OR LOCATE(LOWER(Word), LOWER('$user_input')) > 0;
内容的提问来源于stack exchange,提问作者Arj
相关产品推荐
相关产品推荐

