2009-12-07 126 views
2

只需要查看段落是否包含“停用词”,停用词在下面的数组中。另一个棘手的preg_match

我有公式为:

$pattern_array = array("preheat", "minutes", "stir", "heat", "put", "beat", "bowl", "pan"); 

    foreach ($pattern_array as $pattern) { 
     if (preg_match('/'.$pattern.')/i', $paragraph)) { 
     $stopwords = 1; 
     } 
    } 

其中一期工程不够好,但对于像像“panko”被确定为停用词“泛”字短词。

所以正则表达式就像它必须在它之前有一个空格,或者是一个新行的开始,并以句号/空格/逗号/(其他非字符对象)结尾。

另外我怎么能告诉PHP退出循环,一旦停止词被识别?

谢谢你们,放慢我的学习正则表达式!

+1

至于停止循环,当你发现一个比赛,看看php.net/break – 2009-12-07 18:02:21

回答

4

使用\b(preheat|minutes|stir|heat|put|bowl|pan)\b作为您的正则表达式。这样,你只需要一个正则表达式(不需要循环),并通过使用字边界断言,确保只有整个单词匹配。

+0

好吧我使用了这种方法(所有在一个正则表达式\ b),如果正则表达式中的项目数量过大,我会被告知性能问题。多少项目会太多? – bluedaniel 2009-12-07 18:14:30

+0

很难说。如果你想匹配单词边界,并且循环遍历大量的正则表达式可能比拥有一个大的正则表达式要慢一些,我想你会被困在正则表达式中。你可以做一些优化,如'\ b(p(?:reheat | ut | an)| st(?:ir | ove)| etc。)\ b',这样正则表达式引擎可以在找到第一个字符不匹配,但最好在不必要的优化之前先尝试一下。 – 2009-12-07 18:33:48

+0

嗯,这是一个有趣的方法,它绝对是一个应用程序按预期工作,然后优化小部分东西的情况。我稍后再试一次,为你的后续行动接受你的答案。欢呼蒂姆。 – bluedaniel 2009-12-07 18:43:11

2

还没有试过这个,但\b应该是你要找的字符组。从PHP manual

\b word boundary 

你的代码,然后将是这个样子:

$pattern_array = array("preheat", "minutes", "stir", "heat", "put", "beat", "bowl", "pan"); 

foreach ($pattern_array as $pattern) { 
    if (preg_match('/\b'.$pattern.'\b/i', $paragraph)) { // also removed the ')' 
    $stopwords = 1; 
    break; // to exit the loop 
    } 
} 

编辑:看来人最好使用\ B,所以改变了这个相应

+0

它在主题字符串的末尾不匹配。 – SilentGhost 2009-12-07 18:08:49

+0

或开始的那个 – SilentGhost 2009-12-07 18:09:20

+0

改变了代码使用'\ b',感谢您的评论:-) – 2009-12-07 18:09:51

2

你需要添加\b(代表字边界)到你的正则表达式这样:

'/\b'.$pattern.'\b/i' 

您的代码似乎有拼写错误,因为您有一个文字右括号(并且不匹配部分文字),或者您有一个打开的右括号。

+0

是的抱歉,这是从前代码测试typolo – bluedaniel 2009-12-07 18:11:42

2

1.您可以使用“\ b”来检查单词边界。单词边界被定义为单词字符和非单词字符之间的边界。单词字符是字母,数字和下划线。

2.可以一气呵成做这一切,通过使用“|”:

$stopwords = preg_match('/\\b(preheat|minutes|stir|heat|..other words..|pan)\\b/i', $paragraph) 
+0

好吧,我使用了这种方法(所有在一个正则表达式不是\ b),并且如果正则表达式中的项目数量变得太大,我会被警告性能问题。多少项目会太多? – bluedaniel 2009-12-07 18:31:41