2

我正在一个网站上实现一个简单的搜索,现在我正在清理输入。我的计划是制作一个允许字符的白名单。我正在使用 PHP,到目前为止,我已经有了当前的正则表达式:

preg_replace('/[^a-z0-9 -]/i', '', $s);

所以,我要删除任何不是字母数字、空格或连字符的东西。

这类事情是否有一个普遍接受的白名单,还是仅取决于应用程序?我将搜索书名、作者姓名和书籍简介。

4

3 回答 3

2

怎么样2010 (A space odyssey)?Giscard d`Estaing的自传怎么样?......这真的不可能一般回答,这将取决于您的应用程序和数据结构。

您想查看您选择的数据库的全文搜索功能,甚至是 Sphinx 等专门的搜索工具。

明确您将首先使用什么引擎来实际执行搜索,关于您需要删除的内容的规则将变得更加清晰。

于 2010-11-05T17:02:32.277 回答
0

没有通用的正则表达式来解决这个问题。你的代码去掉了很多你可能想要保留的东西,比如逗号、感叹号、(半)冒号和非英文字母。如果您有数据库中所有标题的完整列表,您应该能够编写一个脚本来构建在所有标题中找到的所有字符的列表。如果您的正则表达式去掉了这些字符中的任何一个,那么您就有可能遇到问题(尽管通过此测试并不意味着您不会遇到问题)。

根据其余搜索的实施方式,您可能能够去除有效字符并仍然返回相关的搜索结果。在这种情况下,您可能希望您的表达式允许非英文字符(因为您不想拆分单词),但您可能能够删除不在引号分隔的短语内的所有标点符号。例如,搜索red haired应该给你所有你会从搜索中得到的结果,red-haired再加上一些额外的结果。

于 2010-11-05T17:14:38.743 回答
0

谷歌有一些非常高级的搜索规则,但他们的基本规则是这样的:

一般会忽略标点符号,包括@#$%^&*()=+[]\等特殊字符。

然而,谷歌对常见的搜索词有例外,比如 C++、C# 或 $100。

如果您想要像 Google 一样复杂的搜索,您可以针对上述标点符号制定规则并有一些例外。但是,对于简单的搜索,只需忽略 Google 通常会忽略的字符。

于 2010-11-05T17:05:44.460 回答