另一个棘手的preg_match

时间:2009-12-07 17:58:23

标签: php regex text 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;
      }
    }

哪种方法效果不错,但对于像'pan'这样的短语,像'panko'这样的单词被认为是一个停用词。

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

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

谢谢大家,我一边慢慢学习正则表达式!

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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,因此相应更改了

答案 2 :(得分:2)

你需要将\b(代表单词边界)添加到正则表达式中,如下所示:

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

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

答案 3 :(得分:2)

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

2。您可以使用“|”一次完成所有操作:

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