2011-11-24 18 views
7

Sto cercando un modo per estrarre il numero X di parole su entrambi i lati di una determinata parola in una ricerca.Estrai X numero di parole che circondano una determinata stringa di ricerca all'interno di una stringa

Ad esempio, se un utente immette "detenuto" come parola di ricerca e la query MySQL trova un post che contiene "detenuto" nel contenuto del post, vorrei restituire non l'intero contenuto del post ma solo x il numero di parole su entrambi i lati per dare all'utente il senso del post e poi possono decidere se vogliono continuare sul post e leggerlo per intero.

Sto usando PHP.

Grazie!

+0

Questo potrebbe anche aiutare: http://stackoverflow.com/q/1436582/1066234 –

risposta

8

Potrebbe non essere possibile risolvere completamente questo problema con regex. Ci sono troppe possibilità di altri personaggi tra le parole ...

ma si può provare questa espressione regolare:

((?:\S+\s*){0,5}\S*inmate\S*(?:\s*\S+){0,5}) 

vedere qui: rubular

si potrebbe anche voler escludere certi personaggi come loro non sono contati come parole. In questo momento l'espressione regolare conta ogni sequenza di caratteri non spaziali che sono circondati da spazi come parola.

a corrispondere solo a parole vere:.

((?:\w+\s*){0,5}<search word>(?:\s*\w+){0,5}) 

Ma qui qualsiasi carattere non di parola (. ", Ecc), i freni corrispondenti

Così si può andare avanti ...

((?:[\w"',.-]+\s*){0,5}["',.-]?<search word>["',.-]?(?:\s*[\w"',.-]+){0,5}) 

Ciò corrisponderebbe anche a 5 parole con una di "", .- attorno al termine di ricerca.

di utilizzarlo in php:

$sourcestring="For example, if a user enters \"inmate\" as a search word and the MySQL"; 
preg_match_all('/(?:\S+\s*){0,5}\S*inmate\S*(?:\s*\S+){0,5}/s',$sourcestring,$matches); 
echo $matches[0][0]; // you might have more matches, they will be in $matches[0][x] 
+0

Per aggiungere alla risposta di morja, è è possibile selezionare la stringa da MySQL con preg_match di PHP: http://php.net/manual/en/function.preg-match.php. – bozdoz

+0

Grazie, ci proverò quando ne avrò una possibilità più tardi oggi. Apprezzo il tempo che avrai preso per rispondere a questo! –

+0

L'ho provato, funziona a volte su Rubular ... Hmmm ... Ho provato a implementarlo in PHP e non riesco a spiegarmelo ... Qualcuno potrebbe indicarmi la giusta direzione? –

1

Vorrei usare questa espressione regolare per PHP che tiene anche i caratteri UTF8 conto

'~(?:[\p{L}\p{N}\']+[^\p{L}\p{N}\']+){0,5}<search word>(?:[^\p{L}\p{N}\']+[\p{L}\p{N}\']+){0,5}~u' 

In questo caso '~' è il delimitatore e il Modificatore 'u' alla fine identifica la regex interpretata da UTF8.

vedere documentazione sui identificatori Unicode Regex qui:

http://www.regular-expressions.info/refunicode.html

Problemi correlati