【问题标题】:Another tricky preg_match另一个棘手的 preg_match
【发布时间】:2009-12-07 17:58:22
【问题描述】:

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

我的公式是:

$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 退出循环?

谢谢大家,我学习正则表达式的速度变慢了!

【问题讨论】:

  • 找到匹配项时停止循环,请查看 php.net/break

标签: php regex text preg-match


【解决方案1】:

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

【讨论】:

  • 好的,我已经使用了这种方法(多合一的正则表达式而不是 \b),如果正则表达式中的项目数量变得太大,我会收到有关性能问题的警告。有多少项目会太多?
  • 很难说。我想如果你想匹配单词边界,你会被正则表达式所困扰,并且循环多个正则表达式可能比拥有一个大的正则表达式要慢。你可以做一些优化,比如\b(p(?:reheat|ut|an)|st(?:ir|ove)|etc.)\b,这样正则表达式引擎可以在发现第一个字符不匹配后跳过部分匹配,但最好先尝试一下,然后再进行不必要的优化。
  • 嗯,这是一个有趣的方法,它绝对是让应用程序按预期工作然后优化小部分内容的案例。稍后我会尝试一下,对于您的跟进,我会接受您的回答。干杯蒂姆。
【解决方案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,所以相应地改变了这个

【讨论】:

  • 它不会在主题字符串的末尾匹配。
  • 或者这件事的开始
【解决方案3】:

您需要像这样将\b(代表单词边界)添加到您的正则表达式中:

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

您的代码中似乎有错字,因为您有一个文字右括号(并且不匹配部分单词),或者您有一个开放的右括号。

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • 好的,我已经使用了这种方法(多合一的正则表达式而不是 \b),如果正则表达式中的项目数量变得太大,我会收到有关性能问题的警告。有多少项目会太多?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2011-10-25
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多