首页 > 解决方案 > PHP如何使用php检查数据库中的文本中是否包含字符串

问题描述

我正在创建一个释义系统,用户输入文本和系统为他们释义。

我的数据库如下所示:

关键词:精致

同义词1:选择;可口的; 可口; 多汁;甜美; 可口; 咸味的

同义词2:空灵;美丽的; 脆弱的; 迷人; 娇小;脆弱; 优雅的

其中 Keyword (varchar)、Synonym1 (text) 和 Synonym2 (text) 是数据库列。上面的示例是具有 3 个字段及其值的数据库的一行。

例如,如果系统找到一个单词,例如,它是这样工作的,那么它可以被任何用分号分隔的单词替换 Synomyn1 或 Synonym2 或关键字,因为它们都是同义词

让我解释一下单词搜索是如何工作的。系统先在Keyword栏搜索单词,如果没有找到,我再往Synmon1栏搜索单词,以此类推。

我的问题是在 Synonym1 或 Synonym2 列中检查用户的特定单词。当我使用 LIKE 子句(从数据库中搜索的通用方式)时,系统不是在搜索全名,而是在搜索字符。例如,假设作者的文本是:“ Benson has an ice cube ”,系统假设在 cho ice 中发现了冰。我不想这样,我想搜索一个完整的单词。

如果有人理解我,请帮助解决这个问题。

标签: phpmysqlpdophpmyadmin

解决方案


ice如果我理解您的问题,您希望在列中进行搜索Synonyms1Synonyms2但要确保您不会无意中匹配诸如choice.

如果您曾经阅读或听过有关数据库规范化主题的任何内容,您会意识到您的数据库甚至不满足1NF(第一范式)的要求,因为它具有由重复值组成的列,正如您发现的那样, 使搜索效率低下且困难。但让我们继续:

同义词列可能只包含一个词,因此它可能如下所示:

ethereal

或者:

ethereal; beautiful; fragile; charming; petite; frail; elegant

因此,您正在寻找的词可能是:

  1. 整列值
  2. 前面没有,后面跟着一个;
  3. 前面有一个空格,后面跟一个;
  4. 前面有一个空格,后面没有任何内容

因此,如果您的 MySQL 版本不支持正则表达式,那么如果您正在寻找例如icecolumn中的单词Synonyms2,则 WHERE 子句应该是:

WHERE (
   Synonyms2 = 'ice'
   OR
   Synonyms2 like 'ice;%'
   OR
   Synonyms2 like '% ice;%'
   OR
   Synonyms2 like '% ice'
)

如果您正在运行 SQL 8+,则:

WHERE regexp_like(Synonyms2, '( |^)ice(;|$)')

这表明ice必须以空格或字符串开头,后跟字符串;或字符串结尾。


推荐阅读