Tengo un fragmento de código escrito en PHP que extrae un bloque de texto de una base de datos y lo envía a un widget en una página web. El bloque de texto original puede ser un artículo largo o una oración corta o dos; pero para este widget no puedo mostrar más de, digamos, 200 caracteres. Podría usar substr () para cortar el texto en 200 caracteres, pero el resultado sería cortar en el medio de las palabras; lo que realmente quiero es cortar el texto al final de la última palabra antes de 200 caracteres.
183
s($str)->truncateSafely(200)
útil, como se encuentra en esta biblioteca independiente .Respuestas:
Mediante el uso de la función wordwrap . Divide los textos en varias líneas, de modo que el ancho máximo es el que especificó, rompiendo los límites de las palabras. Después de dividir, simplemente toma la primera línea:
Una cosa que este oneliner no maneja es el caso cuando el texto en sí es más corto que el ancho deseado. Para manejar este caso límite, uno debe hacer algo como:
La solución anterior tiene el problema de cortar prematuramente el texto si contiene una nueva línea antes del punto de corte real. Aquí una versión que resuelve este problema:
Además, aquí está la clase de prueba PHPUnit utilizada para probar la implementación:
EDITAR:
No se manejan caracteres especiales UTF8 como 'à'. Agregue 'u' al final del REGEX para manejarlo:
$parts = preg_split('/([\s\n\r]+)/u', $string, null, PREG_SPLIT_DELIM_CAPTURE);
fuente
\n
ancho anterior al deseado.Arabic
letras largas y ahora se reduce a palabras correctas con la ayuda de latokenTruncate
función ... tnx un millón :)Esto devolverá los primeros 200 caracteres de palabras:
fuente
if (strlen($string) > $your_desired_width) { preg_replace(...); }
/\s+?(?:\S+)?$/
Y ahí lo tiene: un método confiable para truncar cualquier cadena a la palabra completa más cercana, mientras se mantiene por debajo de la longitud máxima de la cadena.
He probado los otros ejemplos anteriores y no produjeron los resultados deseados.
fuente
if
declaración:if (strlen($str) > 200) { ... }
$WidgetText = substr($string, 0, strpos($string, ' ', 200));
La siguiente solución nació cuando noté un parámetro $ break de la función wordwrap :
Aquí está la solución :
Ejemplo 1.
El ejemplo anterior generará:
Ejemplo # 2.
El ejemplo anterior generará:
fuente
description
de una publicación de blog)preg_replace('/\s+/', ' ', $description)
para reemplazar todos los caracteres de espacios en blanco con un solo espacio;)Tenga en cuenta siempre que esté dividiendo por "palabra" en cualquier lugar donde algunos idiomas, como el chino y el japonés, no utilicen un carácter de espacio para dividir las palabras. Además, un usuario malintencionado podría simplemente ingresar texto sin espacios, o usar un poco de Unicode similar al carácter de espacio estándar, en cuyo caso cualquier solución que use puede terminar mostrando el texto completo de todos modos. Una forma de evitar esto puede ser verificar la longitud de la cadena después de dividirla en espacios como es normal, luego, si la cadena todavía está por encima de un límite anormal, tal vez 225 caracteres en este caso, seguir adelante y dividirla tontamente en ese límite.
Una advertencia más con cosas como esta cuando se trata de caracteres no ASCII; las cadenas que las contienen pueden ser interpretadas por strlen () estándar de PHP como más largas de lo que realmente son, porque un solo carácter puede tomar dos o más bytes en lugar de solo uno. Si solo usa las funciones strlen () / substr () para dividir cadenas, ¡puede dividir una cadena en el medio de un carácter! En caso de duda, mb_strlen () / mb_substr () son un poco más infalibles.
fuente
Use strpos y substr:
Esto le dará una cadena truncada en el primer espacio después de 30 caracteres.
fuente
Aqui tienes:
fuente
Aquí está mi función basada en el enfoque de @ Cd-MaN.
fuente
Descripción:
^
- comenzar desde el principio de la cadena([\s\S]{1,200})
- Obtén de 1 a 200 de cualquier personaje[\s]+?
- no incluye espacios al final del texto corto para que podamos evitar enword ...
lugar deword...
[\s\S]+
- coincide con el resto del contenidoPruebas:
regex101.com
agreguemos aor
algunos otrosr
regex101.com
orrrr
exactamente 200 caracteresregex101.com
después del quintor
orrrrr
excluido.Disfrutar.
fuente
$1
es un "reemplazo", pero en este contexto específico, ¿a qué se refiere? una variable vacía?$1
referencia para hacer coincidir los corchetes internos([\s\S]{1,200})
.$2
hará referencia a dos segundos par de corchetes si hay alguno en el patrón.Es sorprendente lo difícil que es encontrar la solución perfecta para este problema. Todavía no he encontrado una respuesta en esta página que no falle en al menos algunas situaciones (especialmente si la cadena contiene nuevas líneas o pestañas, o si el salto de palabra no es un espacio, o si la cadena tiene UTF- 8 caracteres multibyte).
Aquí hay una solución simple que funciona en todos los casos. Aquí hubo respuestas similares, pero el modificador "s" es importante si desea que funcione con entrada de líneas múltiples, y el modificador "u" hace que evalúe correctamente los caracteres multibyte UTF-8.
Un posible caso límite con esto ... si la cadena no tiene ningún espacio en blanco en los primeros caracteres $ characterCount, devolverá la cadena completa. Si lo prefiere, fuerza un descanso en $ characterCount incluso si no es un límite de palabra, puede usar esto:
Una última opción, si desea que se agregue puntos suspensivos si trunca la cadena ...
fuente
Usaría la función preg_match para hacer esto, ya que lo que quieres es una expresión bastante simple.
La expresión significa "hacer coincidir cualquier subcadena que comience desde el comienzo de la longitud 1-200 que termine con un espacio". El resultado está en $ resultado y la coincidencia está en $ coincidencias. Eso se ocupa de su pregunta original, que termina específicamente en cualquier espacio. Si desea que finalice en nuevas líneas, cambie la expresión regular a:
fuente
Ok, obtuve otra versión de esto basada en las respuestas anteriores, pero teniendo en cuenta más cosas (utf-8, \ n y & nbsp;), también una línea que elimina los códigos abreviados de wordpress comentados si se usa con wp.
fuente
Esta es una pequeña solución para la respuesta de mattmac:
La única diferencia es agregar un espacio al final de $ string. Esto asegura que la última palabra no se corte según el comentario de ReX357.
No tengo suficientes puntos de representante para agregar esto como comentario.
fuente
Uso:
Esto generará las primeras 10 palabras.
La
preg_split
función se usa para dividir una cadena en subcadenas. Los límites a lo largo de los cuales se dividirá la cadena se especifican utilizando un patrón de expresiones regulares.preg_split
La función toma 4 parámetros, pero solo los 3 primeros son relevantes para nosotros en este momento.Primer parámetro: patrón El primer parámetro es el patrón de expresiones regulares a lo largo del cual se dividirá la cadena. En nuestro caso, queremos dividir la cadena entre los límites de las palabras. Por lo tanto, utilizamos una clase de caracteres predefinida
\s
que coincide con los caracteres de espacio en blanco, como espacio, tabulación, retorno de carro y avance de línea.Segundo parámetro: cadena de entrada El segundo parámetro es la cadena de texto larga que queremos dividir.
Tercer parámetro: límite El tercer parámetro especifica el número de subcadenas que se deben devolver. Si establece el límite en
n
, preg_split devolverá una matriz de n elementos. Los primerosn-1
elementos contendrán las subcadenas. El último(n th)
elemento contendrá el resto de la cadena.fuente
Basado en la expresión regular de @Justin Poliey:
fuente
Tengo una función que hace casi lo que quieres, si haces algunas ediciones, se ajustará exactamente:
fuente
Así es como lo hice:
fuente
Sé que esto es viejo, pero ...
fuente
Creo una función más similar a substr, y uso la idea de @Dave.
Ps .: El corte de longitud completa puede ser menor que substr.
fuente
Se agregaron sentencias IF / ELSEIF al código de Dave y AmalMurali para manejar cadenas sin espacios
fuente
Me parece que esto funciona:
function abreviatura_cadena_a_todo_palabra ($ string, $ max_length, $ buffer) {
}
El búfer le permite ajustar la longitud de la cadena devuelta.
fuente
Utilizar este:
el siguiente código eliminará ','. Si tiene otro carácter o subcadena, puede usarlo en lugar de ','
// si tienes otra cuenta de cadena para
fuente
Si bien esta es una pregunta bastante antigua, pensé que proporcionaría una alternativa, ya que no se mencionó y es válida para PHP 4.3+.
Puede usar la
sprintf
familia de funciones para truncar texto, utilizando el%.ℕs
modificador de precisión.Truncamiento simple https://3v4l.org/QJDJU
Resultado
Truncamiento ampliado https://3v4l.org/FCD21
Dado que
sprintf
funciona de manera similarsubstr
y parcialmente cortará las palabras. El siguiente enfoque garantizará que las palabras no se corten al usarlasstrpos(wordwrap(..., '[break]'), '[break]')
con un delimitador especial. Esto nos permite recuperar la posición y garantizar que no coincidamos con las estructuras de oración estándar.Devolver una cadena sin cortar parcialmente las palabras y que no exceda el ancho especificado, conservando los saltos de línea si se desea.
Resultado
Resultados usando
wordwrap($string, $width)
ostrtok(wordwrap($string, $width), "\n")
fuente
Usé esto antes
fuente
Aquí puedes probar esto
fuente
Creo que esta es la forma más fácil de hacerlo:
Estoy usando los caracteres especiales para dividir el texto y cortarlo.
fuente
Puede ser que esto ayude a alguien:
fuente