2010-02-20 8 views
12

Me gustaría poder extraer las primeras X palabras de un campo de base de datos para usar en una vista previa. Básicamente, si un contenido de materia 's eraExtraiga las primeras palabras X (no solo caracteres) de mySQL

"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris malesuada." 

me gustaría hacer eco

"Lorem ipsum dolor sit amet... see more" 

Cuál es la mejor manera de hacer esto?

La única cosa que sé hacer es tirar de todo el campo en una consulta y luego hacer algo como

$foo = [query_results]; 
$bar = explode(' ', $foo); 
for($x=0, $x<6, $x++){ 
    echo $bar[$x]; 
}; 
echo "... see more" 

¿Hay una mejor aproximación a este?

+1

¿Supone que siempre hay al menos seis palabras? –

+0

Bueno, esto es medio pedido por tiempo. Sí, esta solución supone siempre 6 palabras. Obviamente pondré un código mejor para explicar la posibilidad de menos. –

Respuesta

14

definitivamente quiere utilizar SUBSTRING_INDEX que devolverá un número de Char actúa hasta que se alcanza un recuento especificado en función de la aparición de un delimitador.En su caso la llamada se vería así:

SELECT SUBSTRING_INDEX(text_field, ' ', 6) FROM ... 

En particular, esto devolverá hasta seis palabras donde se define una palabra como un conjunto de caracteres que no son espacios delimitados por espacios.

Nota: esto devolverá la puntuación adjunta a la última palabra, que puede o no ser deseada. Sería lo suficientemente simple como para reemplazar los caracteres de puntuación en la cola de la cadena en PHP, pero si quieres permanecer completamente dentro de SQL creo que puedes usar TRIM. La sintaxis de que sería algo así como:

SELECT TRIM(TRAILING ',' FROM SUBSTRING_INDEX(text_field, ' ', 6)) FROM ... 

Puede haber una mejor opción para la eliminación de la puntuacion de salida - pero tal vez eso es otra cuestión (todavía estoy buscando una solución mejor que TRIM).

+0

Marcándote como la respuesta tanto para responder como para explicar por qué es la respuesta. ¡Gracias una tonelada! –

0

Método 1 (Mejor):

No, también se podría utilizar la función substring de MySQL a buscar texto deseado directamente desde el campo.

Prototipo:

SUBSTRING(string,position) 

Ejemplo:

SELECT SUBSTRING(field, 25) FROM table 

Método 2:

También puede utilizar la función de PHP substr para el mismo propósito, pero primero tendrá tiene que seleccionar wh valor del campo ole de db.

$cutted = substr($row['fieldname'], 0, 25) . '.....'; // get 25 chars and append .... 

En su caso:

$str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris malesuada."; 
$parts = explode(" ", $str); 
print $parts[0] . ' ' .$parts[1] . ' ' .$parts[2] . ' ' .$parts[3] . ' ' .$parts[4] . '.....See More'; 

Salida:

Lorem ipsum dolor sit amet.....See More 
+0

OP pidió una solución que cuente y restrinja las palabras (en función del espacio delimitado) * ¡no * caracteres! –

0
SELECT SUBSTRING(`Filed_Name`,1,X) FROM `Table` where field2 = 0 

Tou puede reemplazar X en la cláusula subcadena por los caracteres que necesite mostrar.

+0

excepto que OP necesita mostrar * palabras * no caracteres ... –

5

así que podría hacerlo en su consulta utilizando la función de subcadena

SELECT CONCATENATE(SUBSTRING(myfield, 0, N), "... see more") FROM mytable 

que les permite conocer las primeras letras N ...

si realmente desea obtener los primeros N palabras y usted definir palabras como "delimitado por espacios", aún se podía hacer en la consulta de la siguiente manera

SELECT CONCATENATE(SUBSTRING_INDEX(myfield," ", N), "... see more") FROM mytable 
+0

¿Es CONCATENADO o CONCAT? Para mí, las cosas funcionan si uso CONCAT pero no CONCATENATE. Estoy usando MySql. – Norman

0

Mi filosofía es, no hacer que la base de datos trabaje demasiado. En mi experiencia, MySQL es mucho más rápido cuando le das una consulta realmente simple y luego haces el trabajo "real" con PHP o cualquier idioma que estés usando. No seguiría ninguna de las sugerencias publicadas: tome toda la cadena y luego reduzca la cantidad con el lenguaje o la elección de scripting. La única excepción sería si la cadena podría ser muy grande, por ej. 50 KB o más. En ese caso, tener la base de datos para reducirlo es quizás más rápido. Pero en realidad, a menos que esté haciendo miles de estas consultas por segundo (y si lo está haciendo mal, use algún tipo de almacenamiento en caché), entonces no creo que haya ninguna razón para que la base de datos haga este trabajo para tú.

0
<?php 
    echo "<h3>".$this->consult['page_caption']."</h3> 

     "; 
    $txt=array(); 
    $txt = explode(" ",html_entity_decode($this->consult['page_content'])); 
    $record = array(); 
    $k =count($txt); 

    for($x=0;$x<=30;$x++){ 
     if( $x < $k){ 
      //if($txt 
      $record[] = $txt[$x]; 
     } 
    } 

    $outdata =implode(" ",$record); 
    echo "<p>".$outdata." <a href='#'> more&raquo;</a></p>"; 
    // html_entity_decode($this->consult['page_content']) 
?> 

Creo que esto también será útil. Lo usé en mi página de índice para obtener parte del contenido con un enlace a la página principal del artículo.

Cuestiones relacionadas