在php中的mysqli字符串中的多字匹配

时间:2018-01-17 02:10:04

标签: php mysql regex mysqli

我有一个类似于以下内容的数据库:

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.

我做错了什么?

2 个答案:

答案 0 :(得分:1)

将模式更改为

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

基本上,(a|b|c)会匹配主题中的abc 。在每个单词之前和之后添加\b(单词边界)可确保仅在单词边界内出现单词时生成匹配,即空格,换行符或其他分隔符。

但是,

In MySQL,转义的特殊字符会被自定义标记替换。对于字边界,请使用[[:<:]][[:>:]]

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

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

答案 1 :(得分:1)

“OR”更简洁:

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

对于“AND”:

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

但是使用

FULLTEXT索引(也是“AND”)会快得多
MATCH (col) AGAINST ('+like +eat' IN BOOLEAN MODE)