Pregunta

Estoy intentando conseguir este método en una cadena de filtro de trabajo:

public function truncate($string, $chars = 50, $terminator = ' …');

Me esperaba esto

$in  = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYXZ1234567890";
$out = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV …";

y también este

$in  = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝ";
$out = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđ …";

Eso es $chars menos los caracteres de la cadena $terminator.

Además, el filtro se supone que corte en la primera límite de palabra por debajo del límite $chars, por ejemplo.

$in  = "Answer to the Ultimate Question of Life, the Universe, and Everything.";
$out = "Answer to the Ultimate Question of Life, the …";

Estoy bastante seguro de que esto debería funcionar con estos pasos

  • cantidad restar de caracteres en terminador de máximos caracteres
  • Validar que la cadena es más larga que el límite calculado o devolverlo inalterada
  • encontrar el último carácter de espacio en cadena por debajo del límite calculado para obtener límite de palabra
  • cadena de corte por fin el espacio o el límite calculado si no se encuentra un último espacio
  • append terminador de cadena
  • cadena de retorno

Sin embargo, he intentado varias combinaciones de funciones y str* mb_* ahora, pero todos arrojado resultados erróneos. Esto no puede ser tan difícil, así que obviamente estoy perdiendo algo. ¿Alguien por cuota de una implementación funcional de este o que me señale un recurso donde por fin puedo entender cómo hacerlo.

Gracias

P.S. Sí, he comprobado https://stackoverflow.com/search?q=truncate+string+php antes:)

¿Fue útil?

Solución

Prueba esto:

function truncate($string, $chars = 50, $terminator = ' …') {
    $cutPos = $chars - mb_strlen($terminator);
    $boundaryPos = mb_strrpos(mb_substr($string, 0, mb_strpos($string, ' ', $cutPos)), ' ');
    return mb_substr($string, 0, $boundaryPos === false ? $cutPos : $boundaryPos) . $terminator;
}

Pero hay que asegurarse de que su codificación interna se establece correctamente.

Otros consejos

acabo de enterar de PHP ya tiene un multibyte truncado con

no obedece límites de la palabra sin embargo. Pero es práctico no obstante!

Normalmente no me gusta de código sólo una respuesta completa a una pregunta como esta. Pero también me acabo de despertar, y pensé que tal vez su pregunta me metería en un buen estado de ánimo para ir programa para el resto del día.

Yo no trató de ejecutar esto, pero debería funcionar o al menos conseguir que el 90% del camino.

function truncate( $string, $chars = 50, $terminate = ' ...' )
{
    $chars -= mb_strlen($terminate);
    if ( $chars <= 0 )
        return $terminate;

    $string = mb_substr($string, 0, $chars);
    $space = mb_strrpos($string, ' ');

    if ($space < mb_strlen($string) / 2)
        return $string . $terminate;
    else
        return mb_substr($string, 0, $space) . $terminate;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top