【问题标题】:Regex to match sentences with at least n words正则表达式匹配至少有 n 个单词的句子
【发布时间】:2010-09-04 18:14:15
【问题描述】:

我正在尝试从包含至少 5 个 PHP 单词的文本中提取所有句子。假设句子以句号、问号或感叹号结尾,我想出了这个:

 /[\w]{5,*}[\.|\?|\!]/ 

任何想法,有什么问题?

另外,需要做什么才能使用 UTF-8?

【问题讨论】:

  • "有什么想法,怎么了?"究竟发生了什么?一个错误?没有达到你的预期?

标签: php regex utf-8


【解决方案1】:

\w 只匹配单个字符。一个单词就是\w+。如果你需要至少 5 个单词,你可以这样做:

/(\w+\s){4,}\w+[.?!]/

即至少 4 个单词后跟空格,然后是另一个单词,后跟一个句子分隔符。

【讨论】:

    【解决方案2】:

    我同意此处发布的解决方案。如果您在 PHP 中使用 preg 函数,您可以添加 'u' 模式修饰符以使其与 UTF-8 一起使用。以/(\w+\s){4,}\w+[.?!]/u 为例

    【讨论】:

      【解决方案3】:

      没有正则表达式的方法:

      $str = "this is a more than five word sentence. But this is not. Neither this. NO";
      
      $sentences = explode(".", $str);
      foreach($sentences as $s)
      {
         $words = explode(' ', $s);
         if(count(array_filter($words, 'is_notempty')) > 5)
             echo "Found matching sentence : $s" . "<br/>";
      }
      
      function is_notempty($x)
      {
       return !empty($x);
      }
      

      这个输出:

      找到匹配的句子:这是一个超过五个单词的句子

      【讨论】:

      • 请注意,您只能使用单个分隔符“分解”。 OP表示句子可以以.?!中的任何一个结尾。
      猜你喜欢
      • 2013-06-14
      • 1970-01-01
      • 2017-10-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2014-11-22
      • 2013-01-23
      相关资源
      最近更新 更多