【发布时间】:2011-10-03 14:38:15
【问题描述】:
我在我的 PHP 项目中有这个问题要解决,其中一些关键字(从几百到几千,长度可以变化)需要在大约 100-300 个字符长的字符串中搜索,有时长度更短 30- 50 个字符。我可以预处理关键字以重用于搜索字符串的新实例。我对 PHP 有点陌生,在 PHP 库中没有找到这样做的方法。经过一番搜索,我在 Aho Corasick 算法中找到了一些不错的候选者,然后是 Sun Wu 和 Udi Manber 的改进,它似乎也被称为 agrep(或者是 agrep 的一部分):http://webglimpse.net/pubs/TR94-17.pdf
还有 Rabin Karp、Suffix Trees 等,但它们看起来不太适合,因为第一个是固定长度的关键字,而后者看起来很通用,需要做很多工作。
谁能告诉我在 php 中自己实现 Agrep/Sun Wu-Manber 是否是解决此问题的好方法?还有其他反馈吗?
编辑:正如我在下面的评论中提到的,有数百个或更多不同的搜索关键字,因此正则表达式无济于事。所以这种反应是没有帮助的。
【问题讨论】:
-
有很多方法可以做到,第一个问题是:这些词是从哪里来的?
-
关键字是一个固定的集合,每次执行搜索的可搜索字符串都会不同。所以我可以对关键字做一些预处理。
-
你可以尝试做的是这个。将关键字放入数组中;然后对数组进行客户比较器搜索。您的比较器功能将根据各个关键字检查您的可搜索字符串。另一种选择是准备一个包含所有关键字的大正则表达式 - 它看起来像这样:
/keyword1|keyword2|keyword3|.../- 当然,您需要对特殊字符进行适当的转义。然后您可以简单地使用preg_match()来查看是否匹配。 -
我同意,如果你有一组固定的词,你可以使用 preg_match,但如果你有一个大的词集要搜索,它可能会有点慢。
-
为所有关键字创建单个正则表达式实际上与我提到的 Aho-Corasick 算法类似。以标准的算法方式来做这件事并非易事,因为它们是不相关的不同单词。
标签: php search keyword string-algorithm agrep