2011-02-16 23 views
6

Mi cliente está buscando una forma de enviar un mensaje de texto al script de Twilio PHP que programé y luego hacer que se lo retransmita al personal en el campo. Esa es la parte fácil, simplemente verifique si el número entrante está autorizado, extraiga los datos del personal de MySQL y distribúyalo.Romper cadenas largas con PHP para SMS salientes

Aquí está la parte difícil: las personas que usan esto pueden tener un largo aliento y sus teléfonos les permiten ingresar más de 160 caracteres. Asumiendo que Twilio puede recibir> 160 caracteres (sé que no puede enviar> 160), necesito dividir este mensaje largo (cadena) en trozos que caen bajo 160 caracteres.

Aquí está la secuencia de comandos que se me ocurrió, funciona bien, pero me gustaría que termine en una palabra completa, en lugar de simplemente el siguiente carácter una vez que se haya dividido. Una historia divertida, cuando te olvidas de ingresar la longitud en la que dividir la cadena, ¡recibes aproximadamente 171 mensajes de texto de un personaje! : P

<?php 
$string = "Ulysses, Ulysses - Soaring through all the galaxies. In search of Earth, flying in to the night. Ulysses, Ulysses - Fighting evil and tyranny, with all his power, and with all of his might. Ulysses - no-one else can do the things you do. Ulysses - like a bolt of thunder from the blue. Ulysses - always fighting all the evil forces bringing peace and justice to all."; 
$arr = str_split($string, 155); //Factoring in the message count 
$num = count($arr); //See how many chunks there are 

$i = 1; //Set interval to 1 
foreach ($arr as $value) { 
    if ($num > 1) { 
    echo "($i/$num) $value<br/>"; //(x/x) Message... 
    $i++; 
} else { 
    echo $value; //Message... 
} 

} 
?> 

Muchas gracias

CORRECCIÓN Lo sentimos, gran descuido de mi parte - He publicado la secuencia de comandos de desarrollo para jugar con las cuerdas en lugar de la secuencia de comandos en vivo que envía el SMS real después de "la incidente." Necesito poder iterar sobre los fragmentos para enviar cada uno como su propio SMS después de que se haya dividido, como lo anterior hará ... acaba de terminar con una palabra completa. El SMS se enviaría en el bucle foreach.

+0

+1 para la historia lado divertido ... maldición - espero que tengas un teléfono que permite "Eliminar todo" y no solo eliminación individual –

+0

De hecho, pero me pasé como $ 3.40 en cambio con Twilio debido a eso LOL – NightMICU

+0

¿No tienen una forma de probar tu código gratis antes de que "entre en funcionamiento" un descuido tal vez? –

Respuesta

8

que no entiendo por qué todo el sobre respuestas complicadas cuando se puede simplemente usar:

$chunks = explode("||||",wordwrap($message,155,"||||",false)); 
$total = count($chunks); 

foreach($chunks as $page => $chunk) 
{ 
    $message = sprintf("(%d/%d) %s",$page+1,$total,$chunk); 
} 

Esto produciría algo como:

(1/3) Primis facilis apeirian vis ne. Idque ignota est ei. Ut sonet indoctum nam, ius ea illum fabellas. Pri delicata percipitur ad, munere ponderum rationibus.

Ejemplo línea: http://codepad.org/DTOpbPIJActualizado

+0

Eso es básicamente lo que ya tenía: el problema terminaba en una palabra COMPLETA, en lugar de en un fragmento. – NightMICU

+0

actualizado para el ajuste de palabras. – RobertPitt

+0

Parece que podría ser ideal, ¿cuál es la historia detrás de |||| en la explosión()? – NightMICU

1

puede explode() la cadena primero, usando un espacio como delimitador. Una vez que tenga la matriz, comience a recorrerla y agregue palabras a una cadena una por una. Verifique si la longitud total de la cuerda sería más de 160 antes de agregar la palabra a la cadena. Si es así, comienza una nueva cadena. Puede hacer esto almacenando una matriz de cadenas.

<?php 
$string = "Ulysses, Ulysses - Soaring through all the galaxies. In search of Earth, flying in to the night. Ulysses, Ulysses - Fighting evil and tyranny, with all his power, and with all of his might. Ulysses - no-one else can do the things you do. Ulysses - like a bolt of thunder from the blue. Ulysses - always fighting all the evil forces bringing peace and justice to all." 

$arr = explode(' ', $string); // explode by space 
$msgs = array(); // array of finished messages 

$i = 0; // position within messages array 
foreach($arr as $word) 
{ 
    if (strlen($msgs[$i] . $word) <= 155) // this may be 160, im not sure 
    { 
     $msgs[$i] .= $word; 
    } 
    else 
    { 
     $i++; 
     $msgs[$i] = $word; 
    } 
} 
?> 
+0

Gracias por esto, Scott. De hecho, estaba aprendiendo hasta que vi el código de Robert, que era más compacto y se ajustaba con más facilidad en un guión ya de por sí fuerte (también intentaré recortarlo). Agradezco tu ayuda :) – NightMICU

0

¿Qué tal esto (Nota: no probado, fuera de la parte superior-de-mi-cabeza, pero se entiende la idea):

$string = '<your long message>'; 
$parts = array(); 
while (strlen($string) > 155) { 
    $part = substr($string, 0, 155); 
    $lastSpace = strrpos($part, ' '); 

    $parts[] = substr($string, 0, $lastSpace); 
    $string = substr($string, $lastSpace); 
} 
$parts[] = $string; 

var_dump($parts); 
Cuestiones relacionadas