Próbuję znaleźć zoptymalizowane wyrażenie regularne, aby zwrócić N słów (jeśli są dostępne) wokół innego, aby zbudować podsumowanie. Łańcuch jest w UTF-8, więc definicja "słów" jest większa niż [a-z]. Ciąg, który służy jako słowo referencyjne, może znajdować się w środku słowa lub nie jest bezpośrednio otoczony spacjami.Zoptymalizowane wyrażenie regularne dla N słów wokół danego słowa (UTF-8)
Mam już przy poszukiwaniu więcej niż 6-7 słów wokół siebie jedną z następujących działa, ale wydaje się, że faktycznie chciwy i dławi:
/(?:[^\s\r\n]+[\s\r\n]+[^\s\r\n]*){0,4}lorem(?:[^\s\r\n]*[\s\r\n]+[^\s\r\n]+){0,4}/u
Jest to metoda PHP Mam zbudować zrobić ale potrzebuję pomocy, by regex był mniej chciwy i pracował dla dowolnej liczby słów.
/**
* 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;
}
}
Gdybym miał następujący ciąg: $
"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."
i nazwał getWordsAround($string, 'vitae', 8, 8)
chciałbym uzyskać następujący wynik:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras auctor,
felis non vehicula suscipit,"
Dziękuję za pomoc regex guru.
Na początek '\ s' zawiera' \ r' i '\ n', więc dodanie ich do tej samej klasy znaków jest zbędne. Również '[^ \ s]' jest równoznaczne z '\ S' – NullUserException
wskazówkami, dzięki NullUserException. – lpfavreau
To jest interesujący problem przy okazji. Kiedy wrócę, spróbuję wymyślić lepsze rozwiązanie. +1 – NullUserException