Belirli bir kelime etrafında N kelimeler için optimize regex (UTF-8)

0 Cevap php

Ben bir özetini oluşturmak için başka biri etrafında N kelimeleri (varsa) geri dönmek için optimize edilmiş regex bulmaya çalışıyorum. Dize UTF-8 olduğunu, bu yüzden "kelimeler" tanımı sadece [az] daha büyüktür. Referans kelime olarak hizmet veren dize bir kelime veya direkt olmayan boşluklarla çevrili ortasında olabilir.

Ben zaten çalışıyor ama görünüyor aslında açgözlü ve başka birinin etrafında fazla 6-7 kelime ararken bobinleri aşağıdaki var:

/(?:[^\s\r\n]+[\s\r\n]+[^\s\r\n]*){0,4}lorem(?:[^\s\r\n]*[\s\r\n]+[^\s\r\n]+){0,4}/u

Bu ben bunu inşa ettik ama ben regex daha az açgözlü ve çevresinde kelime herhangi bir sayı için çalışmaya alma yardımına ihtiyacım var PHP yöntemdir.

/**
 * 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;
    }
}

Ben şu $ dize olsaydı:

"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."

Denilen ve getWordsAround($string, 'vitae', 8, 8) Ben şu sonucu elde etmek isterdim:

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

Lütfen yardım regex uzmanları için teşekkür ederiz.

0 Cevap