Estoy tratando de encontrar una expresión regular optimizada para devolver las N palabras (si está disponible) alrededor de otra para crear un resumen. La cadena está en UTF-8, por lo que la definición de "palabras" es más grande que solo [a-z]. La cadena que sirve como palabra de referencia podría estar en medio de una palabra o no estar directamente rodeada de espacios.Regex optimizada para N palabras alrededor de una palabra determinada (UTF-8)
ya tengo los siguientes que funciona, pero parece realmente codicioso y se ahoga en la búsqueda de más de 6-7 palabras alrededor de otro:
/(?:[^\s\r\n]+[\s\r\n]+[^\s\r\n]*){0,4}lorem(?:[^\s\r\n]*[\s\r\n]+[^\s\r\n]+){0,4}/u
Este es el método PHP que he construyo hacer eso, pero necesitaría ayuda para que la expresión regular sea menos codiciosa y funcione para cualquier cantidad de palabras.
/**
* 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;
}
}
si tuviera el siguiente $ cadena:
"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."
y llamó getWordsAround($string, 'vitae', 8, 8)
que me gustaría obtener el siguiente resultado:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras auctor,
felis non vehicula suscipit,"
Gracias por su ayuda gurús de expresiones regulares.
Para empezar, '\ s' incluye' \ r' y '\ n', por lo que es superfluo agregarlos a la misma clase de caracteres. También '[^ \ s]' es equivalente a '\ S' – NullUserException
Sugerencias señaladas, gracias NullUserException. – lpfavreau
Este es un problema interesante por cierto. Cuando regrese intentaré encontrar una mejor solución. +1 – NullUserException