2013-04-04 19 views
1

基本提纲;我正在检索〜100个Facebook状态,并对这些帖子进行搜索以检查它是否包含~20个搜索词之一。当我尝试在浏览器中运行它时,它会锁定,这让我担心在客户端尝试运行它。激烈的循环冻结浏览器;如何让服务器做到这一点?

让服务器运行此操作并返回结果最简单的方法是什么?我可以用Python做到吗?这里是循环,供参考。

function Filter() { 
    console.log("running Filter") 
    //loop through fbObj.posts 
    for (i = 0, l = fbObj.length; i < l; i++){ 
     var post = fbObj[i].post 
     console.log("Checking " + post + " for search terms") 
     //loop through searchTerms 
     for (j = 0; j<searchTermObj.length; j= j++) { 
      searchTerm_variants = searchTermObj[j].words 
      for (x = 0; x < searchTerm_variants.length; x++){ 
       if (post.indexOf(searchTerm_variants[x]) !== 0){ 
        foundPosts[i] = {} 
        foundPosts[i] = fbObj[i] 
       } 
      } 
     } 
    console.log(foundPosts) 
    } 
} 
+1

您不需要在服务器上执行此操作。你只需要一个更好的方法来做到这一点。您可以将所有搜索条件组合成一个单一的(可怕的)正则表达式,然后让运行时的正则表达式引擎发挥最大作用。它几乎可以肯定比你得到的效率更高。 – Pointy 2013-04-04 14:04:59

+0

有关如何实现此目标的任何建议/链接? – jumbopap 2013-04-04 14:07:58

+0

嗯,我猜你已经得到了简单单词的列表。您可以通过将它们与“|”连接来构建正则表达式。我会看看我是否可以在答案中输入如何做到这一点的草图。 – Pointy 2013-04-04 14:15:03

回答

2

你在你的代码中的错误可能解释了锁定:

//loop through searchTerms 
for (j = 0; j<searchTermObj.length; j= j++) { 

j被没有被增加(所以它始终为0):

J ++ j增加,但计算结果为j,它是分配给j。所以这是一个空操作。

因此,您的代码卡在循环中。

+0

我认为这是一个错字,它锁定了,无论如何,但我会重新检查。 – jumbopap 2013-04-04 14:48:28

1

你可以建立一个包罗万象的正则表达式是这样,我想:

var regexWords = [], variants; 
for (var i = 0; i < searchTermObj.length; ++i) { 
    variants = searchTermObj[i].words; 
    for (var j = 0; j < variants.length; ++j) 
    regexWords.push(variants[j]); 
} 

var regex = new RegExp(regexWords.join("|")); 

然后你就可以测试每个岗位是这样的:

for (i = 0, l = fbObj.length; i < l; i++){ 
    var post = fbObj[i].post 
    if (regex.test(post)) { 
     // found a naughty word in the post 
    } 
} 

现在这个长期工程,以便为您的单词列表只是字母单词,没有像“*”或“。”这样的有趣字符。在他们中。如果他们确实包含特殊字符,你仍然可以做这个工作,但它会更复杂一点。

这样做的一个大的正则表达式允许正则表达式引擎采用智能子线性搜索技术,以便每个帖子只需要搜索一次。它仍然可能不是非常快。