lpf*_*eau 6 php regex pcre utf-8
我正在尝试找到一个优化的正则表达式来返回另一个的N个单词(如果可用)以构建摘要.字符串是UTF-8,因此"单词"的定义大于[az].用作参考词的字符串可以位于单词的中间,也可以不直接用空格包围.
我已经得到了以下有效但看起来实际上是贪婪和窒息时,在另一个周围寻找超过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
Run Code Online (Sandbox Code Playgroud)
这是我为此而构建的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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我有以下$ 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."
Run Code Online (Sandbox Code Playgroud)
并打电话给getWordsAround($string, 'vitae', 8, 8)我想要得到以下结果:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras auctor,
felis non vehicula suscipit,"
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助正则表达式大师.
这在这里工作得很好:
(?:[^\s\r\n]*[\s\r\n]+){0,8}(?:[^\s\r\n]*)consectetur(?:[^\s\r\n]*)(?:[\s\r\n]+[^\s\r\n]*){0,8}
Run Code Online (Sandbox Code Playgroud)
给出:
Lorem ipsum dolor sat amet,consectetur adipiscing elit。Cras auctor,非车辆 Suscipit 猫,
然而,这个正则表达式的性能绝对是垃圾。我真的不知道如何提高效率,除非不使用正则表达式。
对于接近结尾的单词来说,性能“绝对垃圾”的原因是,引擎尝试在每个字符上开始匹配,然后前进几十个字符,直到它发现,最后,它找不到你想要的字符串。正在寻找并丢弃一切。
| 归档时间: |
|
| 查看次数: |
872 次 |
| 最近记录: |