Sto cercando di trovare un'espressione regolare per restituire le parole N (se disponibili) attorno a un'altra per creare un riepilogo. La stringa è in UTF-8, quindi la definizione di "parole" è più grande di solo [a-z]. La stringa che funge da parola di riferimento potrebbe essere nel mezzo di una parola o non circondata direttamente da spazi.Espressione regolare ottimizzata per N parole attorno a una determinata parola (UTF-8)
ho già ottenuto il seguente che funziona, ma sembra in realtà avido e soffoca quando alla ricerca di più di 6-7 parole intorno a un altro:
/(?:[^\s\r\n]+[\s\r\n]+[^\s\r\n]*){0,4}lorem(?:[^\s\r\n]*[\s\r\n]+[^\s\r\n]+){0,4}/u
questo è il metodo PHP che ho costruisco fare ma avrei bisogno di aiuto per far sì che la regex sia meno avida e funzioni per qualsiasi numero di parole.
/**
* 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;
}
}
se ho avuto la seguente stringa di $:
"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."
e chiamò getWordsAround($string, 'vitae', 8, 8)
avrei voluto ottenere il seguente risultato:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras auctor,
felis non vehicula suscipit,"
Grazie per il vostro aiuto guru regex.
Per i principianti, '\ s' include' \ r' e '\ n', quindi aggiungerli alla stessa classe di caratteri è superfluo. Anche '[^ \ s]' è equivalente a '\ S' – NullUserException
Note annotate, grazie a NullUserException. – lpfavreau
Questo è un problema interessante tra l'altro. Quando torno cercherò di trovare una soluzione migliore. +1 – NullUserException