2010-01-28 9 views
7

que estoy tratando de conseguir este método en una cadena de filtro de trabajo:puede truncar una cadena multibyte en n caracteres

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

yo esperaría que este

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

y también esta

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

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

Además, se supone que el filtro debe cortarse en el límite de la primera palabra debajo del límite $chars, p. Ej.

$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 el terminador de caracteres máximos
  • validar esa cadena es más larga que el límite calculado o devolverlo inalterada
  • encuentra el último carácter de espacio en cadena debajo del límite calculado para obtener el límite de palabra
  • corta la cadena en el último espacio o límite calculado si no se encuentra el último espacio
  • anexar terminador de cadena
  • cadena de retorno

Sin embargo, he probado varias combinaciones de str* y mb_* funciones ahora, pero todos dieron resultados erróneos. Esto no puede ser tan difícil, así que obviamente me falta algo. Si alguien comparte una implementación que funcione para este o, dirígeme a un recurso donde finalmente pueda entender cómo hacerlo.

Gracias

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

+0

Puede encontrar ['s ($ str) -> truncateSafely (50)'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L246) útil, como se encuentra en [esta biblioteca independiente] (https://github.com/delight-im/PHP-Str). – caw

Respuesta

3

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 está bien ajustado.

+0

Doh, traté de hacerlo funcionar desde ISO-8859-1. Cambió a UTF-8 ahora. Gracias Gumbo. Estoy aceptando esto como la respuesta correcta porque contiene lo único que me faltaba. – Gordon

0

Normalmente, no me gusta simplemente codificar una respuesta completa a una pregunta como esta. Pero también me desperté y pensé que tal vez tu pregunta me pondría de buen humor para ir al programa por el resto del día.

No intenté ejecutar esto, pero debería funcionar o al menos obtener el 90% del camino hasta allí.

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; 
} 
5

acabo de enterar de PHP ya tiene un multibyte truncar con

  • mb_strimwidth - Obtener serie truncada con un ancho especificado

no obedece límites de la palabra sin embargo. ¡Pero a la mano, no obstante!

Cuestiones relacionadas