2011-11-24 32 views
7

Estoy buscando una forma de extraer X palabras en cada lado de una palabra dada en una búsqueda.Extracto X número de palabras que rodean una cadena de búsqueda dada dentro de una cadena

Por ejemplo, si un usuario ingresa "recluso" como palabra de búsqueda y la consulta de MySQL encuentra una publicación que contiene "interno" en el contenido de la publicación, me gustaría devolver no todo el contenido de la publicación, pero solo x número de palabras a cada lado para darle al usuario la esencia de la publicación y luego pueden decidir si desean continuar con la publicación y leerla por completo.

Estoy usando PHP.

Gracias!

+0

Esto también podría ayudar a: http://stackoverflow.com/q/1436582/1066234 –

Respuesta

8

Quizás no pueda resolver completamente este problema con regex. Hay demasiadas posibilidades de otros caracteres entre las palabras ...

pero se puede tratar esta expresión regular:

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

Ver aquí: rubular

También podría excluir ciertos caracteres como se no se cuentan como palabras. En este momento, la expresión regular cuenta cualquier secuencia de caracteres no espaciales que están rodeados de espacios como palabra.

para que coincida con sólo palabras reales:.

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

Pero aquí cualquier carácter no palabra (. ", Etc.) frena el que coinciden

Así se puede ir en ...

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

Esto también coincidiría con 5 palabras con una de "', .- alrededor de su término de búsqueda.

para usarlo en 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

Para añadir a la respuesta de morja, se podría seleccionar la cadena de MySQL con preg_match de PHP: http://php.net/manual/en/function.preg-match.php. – bozdoz

+0

Gracias, voy a probar esto cuando tenga oportunidad más tarde hoy. ¡Aprecio el tiempo que habrás tardado en responder a esto! –

+0

Lo he probado, funciona a veces en Rubular ... Hmmm ... He tratado de implementarlo en PHP y no puedo entenderlo ... ¿Podría alguien apuntarme en la dirección correcta? –

1

me gustaría utilizar esta expresión regular para php que también tiene caracteres UTF8 en cuenta

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

En este caso '~' es el delimitador y el modificator 'u' al final identifica que la expresión regular está interpretada en UTF8.

consulte una documentación acerca de los identificadores de Unicode expresiones regulares aquí:

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

Cuestiones relacionadas