php - 任何更快、更简单的 php preg_match 替代品

标签 php regex cakephp preg-match

我使用的是 cakephp 1.3,我有用户提交文章的文本区域。提交时,我想查看文章中的某些关键词,并为文章添加相应的标签。

我在考虑 preg_match,但是 preg_match 模式必须是字符串。所以我将不得不遍历一个数组(大)。

有没有更简单的方法来插入模式的关键字数组。

非常感谢您的帮助。

谢谢。

最佳答案

我建议将您的关键字数组视为哈希表。小写文章文本,按空格展开,然后遍历展开数组的每个单词。如果该词存在于您的哈希表中,将它插入一个新数组,同时跟踪它出现的次数。

在这种情况下,我运行了一个快速基准测试,将正则表达式与哈希表进行比较。用正则表达式运行 1000 次,需要 17 秒。用哈希表运行它 1000 次,需要 0.4 秒。它应该是一个 O(n+m) 的过程。

$keywords = array("computer", "dog", "sandwich");
$article = "This is a test using your computer when your dog is being a dog";
$arr = explode(" ", strtolower($article));
$tracker = array();

foreach($arr as $word){
    if(in_array($word, $keywords)){
        if(isset($tracker[$word]))
            $tracker[$word]++;
        else 
            $tracker[$word] = 1;
    }
}

$tracker 数组将输出:"computer"=> 1, "dog"=> 2。然后您可以执行该过程来决定要使用的标签。或者如果您不关心关键字出现的次数,您可以跳过跟踪器部分并在关键字出现时添加标签。

编辑:关键字数组可能需要是倒排索引数组以确保最快的查找。我不确定 in_array() 是如何工作的,但如果它搜索,那么它就没有它应该的那么快。倒排索引数组看起来像

array("computer" => 1, "dog" => 1, "sandwich" => 1); // "1" can be any value

然后你会做 isset($keywords[$word]) 来检查这个词是否匹配一个关键字,而不是 in_array(),它应该给你 O(1)。不过,其他人也许可以为我澄清这一点。

关于php - 任何更快、更简单的 php preg_match 替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4314503/

相关文章:

php - 如何将 jQuery 表发送到 Mysql 数据库?

php - 使用正则表达式匹配多个变量(PHP/JS)

php - Mysqli 查询没有返回任何信息?

php - 如何使用php显示sql中开始日期和结束日期或开始时间和结束时间之间的数据?

php - 即使我的用户名和密码正确,仍获取 "Warning: mysqli_connect(): (2800/1045)"

单个空格的正则表达式

java - 正则表达式模式问题

java - 替换除撇号之间的所有下划线(Java、字符串)

php - 无法从 Facebook SDK 获取数据

php - 在 CakePHP 中插入计算机生成的输出