PHP:关键字搜索:查找字符串中的子字符串

时间:2012-11-17 20:27:53

标签: php mysql

我正在建立一个漫画网站并实施了搜索。搜索最初使用图像标题...这很好用:

if (strtolower($input)==strtolower(substr($row['title'],0,strlen($input)))) {

但现在我觉得很多人都不会记得这个头衔。所以我在数据库中添加了一个名为“keywords”的列,varchar [55] ...我的测试条目是字符串“five,second,rule,food,rules”。我想我可以用$row['title']替换$row['keywords'],搜索仍然有用。

如果我从字符串的开头开始搜索就行了,比如我输入“five,seco ......”但是如果我从字符串的中间开始,如“second”或“rule”等,则不行

关于我如何才能做到这一点的任何想法?

谢谢!

4 个答案:

答案 0 :(得分:7)

在漫画专栏中这样做只会带来眼泪,因为它会破坏正常化。你应该做的是创建一个关键字表,每个条目有一个单词,然后是一个与关键字匹配的数据透视表到漫画。然后你可以加入一个来找到匹配的所有漫画。

设置工作更多,但从长远来看更灵活。

编辑:

关键字表:

id     keyword
1      x-men
2      action
3      mystery
4      batman
etc.

comic_keyword表

comic_id    keyword_id
45          3
678         1
678         2
77          3
77          4
etc.

第二个表(数据透视表)将漫画的ID与他们关联的关键字的ID相匹配。这就是多数情况下应该建立多对多关系的方式。

答案 1 :(得分:4)

直接的解决方案是使用stripos代替:

if(stripos($input, $row['title']) !== false) {
    // row matches
}

但是,这不是一个好的解决方案。将过滤卸载到数据库会更好,因此不匹配的行根本不需要前往您的前端。如果您将关键字保留为以逗号分隔的字段,那么LIKEREGEXP将是一个很好的工具选择;如果您规范化了数据库模式,以便将漫画与关键字的1对多关系建模为单独的comic_keywords表格,那么匹配将更加容易。

例如,假设comicidcomic_keywordscomic_idkeyword,您可以选择匹配的漫画

SELECT DISTINCT(comic_id) FROM comic_keywords WHERE keyword = 'blah'

答案 2 :(得分:1)

您可以动态拆分列:

if (in_array(strtolower($input), explode(', ', $row['title']))) {
  /* found it */
}

答案 3 :(得分:0)

看起来您需要Sphinx或(不太可能,但更容易设置)MySQLs full-text search