我正在尝试找到一个优化的正则表达式来返回另一个的N个单词(如果可用)以构建摘要.字符串是UTF-8,因此“单词”的定义大于[a-z].用作参考词的字符串可以位于单词的中间,也可以不直接用空格包围.
我已经得到了以下有效但看起来实际上是贪婪和窒息时,在另一个周围寻找超过6-7个字:
/(?:[^\s\r\n]+[\s\r\n]+[^\s\r\n]*){0,4}lorem(?:[^\s\r\n]*[\s\r\n]+[^\s\r\n]+){0,4}/u
这是我为此而构建的PHP方法,但是我需要帮助让正则表达式变得不那么贪婪并且可以处理任意数量的单词.
/** * Finds N words around a specified word in a string. * * @param string $string The complete string to look in. * @param string $find The string to look for. * @param integer $before The number of words to look for before $find. * @param integer $after The number of words to look for after $find. * @return mixed False if $find was not found and all the words around otherwise. */ private function getWordsAround($string,$find,$before,$after) { $matches = array(); $find = preg_quote($find); $regex = '(?:[^\s\r\n]+[\s\r\n]+[^\s\r\n]*){0,' . (int)$before . '}' . $find . '(?:[^\s\r\n]*[\s\r\n]+[^\s\r\n]+){0,' . (int)$after . '}'; if (preg_match("/$regex/u",$string,$matches)) { return $matches[0]; } else { return false; } }
如果我有以下$string:
"Lorem ipsum dolor sit amet,consectetur adipiscing elit. Cras auctor,felis non vehicula suscipit,enim quam adipiscing turpis,eget rutrum eros velit non enim. Sed commodo cursus vulputate. Aliquam id diam sed arcu fringilla venenatis. Cras vitae ante ut tellus malesuada convallis. Vivamus luctus ante vel ligula eleifend condimentum. Donec a vulputate velit. Suspendisse velit risus,volutpat at dapibus vitae,viverra vel nulla."
并称为getWordsAround($string,’vitae’,8,8)我想获得以下结果:
"Lorem ipsum dolor sit amet,"
感谢您的帮助正则表达式大师.
如何使用正则表达式或其他方法将输入文本拆分为单词数组.然后用循环查找目标单词.一旦找到,就抓住所需的阵列切片,将它们连接在一起并打印.
要保持单词之间的原始空格,可以将其包含在每个单词的末尾.
此外,这可以作为流解析器实现,而不是首先拆分整个字符串.