Оптимизированное регулярное выражение для N слов вокруг заданного слова (UTF-8 )

Я пытаюсь найти оптимизированное регулярное выражение, чтобы вернуть N слов (если они есть) вокруг другого, чтобы построить резюме. Строка в UTF-8, поэтому определение «слова» больше, чем просто [az]. Строка, которая служит справочным словом, может быть в середине слова или не быть непосредственно окружена пробелами.

I ' У нас уже есть следующее, которое работает, но кажется действительно жадным и задыхается при поиске более 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;
    }
}

Если бы у меня была следующая строка $:

"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) I ' Я хочу получить следующий результат:

"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras auctor, 
felis non vehicula suscipit,"

Спасибо за вашу помощь, гуру регулярных выражений.

6
задан lpfavreau 27 August 2010 в 16:36
поделиться