繁体   English   中英

PHP中mysqli字符串中的多字匹配

[英]multi-word match in a mysqli string in php

我有一个看起来如下的数据库:

ID   |   TEXT
1    | I like to eat cheetos.
2    | There is a snake in my boots
3    | to eat is to like food
4    | The sun stopped setting, Rlyah Cthullhu!
5    | Beat the heat with icecram!
6    | Treat yourself!
7    | Eat at Joes!

我有一个mysqli查询,看起来像以下内容...

SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP '/(like)(eat)/');

我也尝试过以下方法:

SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP '/^(^like|^eat)/');
SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP '(like)(eat)');
SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP '/(?=like)(?=eat)/');

这些都不符合任何领域(据我所知,我不知道为什么它们应该起作用)。 出于绝望,我尝试了...

SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP 'like|eat');

当然哪个是“或”而不是“和”匹配,它匹配了1、3、5、6和7。

但是我想要匹配的是1和3。

我究竟做错了什么?

将模式更改为

REGEXP '(\blike\b|\beat\b)')

基本上, (a|b|c)会匹配对象中任何地方的 abc 在每个单词之前和之后添加\\b (单词边界)可确保仅当单词出现在单词边界内(即空格,换行符或其他分隔符)时才产生匹配项。

但是, 在MySQL中,转义的特殊字符将替换为自定义标记。 对于单词边界,请使用[[:<:]][[:>:]]

REGEXP '([[:<:]]like[[:>:]]|[[:<:]]eat[[:>:]])')

https://regex101.com/r/dXiJ6Q/1

对于“或”而言,更为简洁:

REGEXP '[[:<:]](like|eat)[[:>:]]'

对于“ AND”:

    REGEXP '[[:<:]]like[[:>:]]'
AND REGEXP '[[:<:]]eat[[:>:]]'

但是使用FULLTEXT索引(也称为“ AND”)会更快

MATCH (col) AGAINST ('+like +eat' IN BOOLEAN MODE)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM