使用PHP将长字符串拆分为传出短信

使用PHP将长字符串拆分为传出短信,php,string,twilio,Php,String,Twilio,我的客户正在寻找一种方法,将文本消息发送到我编写的Twilio PHP脚本,然后将其重播给现场人员。这是最简单的部分,只需检查传入号码是否经过授权,从MySQL中提取人员详细信息,然后分发 这里有一个棘手的部分-使用它的人可能会说得很长,他们的手机允许他们输入超过160个字符。假设Twilio可以接收大于160个字符(我知道它不能发送大于160个字符),我需要将这条长消息(字符串)分解成小于160个字符的块 这是我想出的脚本,它工作得很好,但我希望它以一个完整的单词结束,而不是简单地拆分后的下一

我的客户正在寻找一种方法,将文本消息发送到我编写的Twilio PHP脚本,然后将其重播给现场人员。这是最简单的部分,只需检查传入号码是否经过授权,从MySQL中提取人员详细信息,然后分发

这里有一个棘手的部分-使用它的人可能会说得很长,他们的手机允许他们输入超过160个字符。假设Twilio可以接收大于160个字符(我知道它不能发送大于160个字符),我需要将这条长消息(字符串)分解成小于160个字符的块

这是我想出的脚本,它工作得很好,但我希望它以一个完整的单词结束,而不是简单地拆分后的下一个字符。有趣的是,当您忘记输入拆分字符串的长度时,您会收到171条左右的单字符文本消息!: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...
}

}
?>

非常感谢

校正 抱歉,我的主要疏忽-我发布了开发脚本来播放字符串,而不是在“事件”之后发送实际短信的实时脚本。我需要能够在分割后迭代块,将每个块作为自己的短信发送出去,如上所述。。以一个完整的单词结尾。短信将在foreach循环中发送。

您可以首先使用空格作为分隔符来输入字符串。一旦有了数组,就开始循环遍历它,并将单词逐个添加到字符串中。在将单词添加到字符串之前,请检查字符串的总长度是否超过160。如果是,请启动一个新字符串。可以通过存储字符串数组来实现这一点

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

这个怎么样(注意:未经测试,我不知道,但你明白了):

$string='';
$parts=array();
而(strlen($string)>155){
$part=substr($string,0155);
$lastSpace=strrpos($part',);
$parts[]=substr($string,0,$lastSpace);
$string=substr($string,$lastSpace);
}
$parts[]=$string;
var_dump(零件);

我不明白为什么当你可以只使用以下选项时,会有这么多复杂的答案:

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

foreach($chunks as $page => $chunk)
{
    $message = sprintf("(%d/%d) %s",$page+1,$total,$chunk);
}
这将产生如下结果:

(1/3)面部无顶原始视觉。伊德克·伊格诺塔是我的朋友。这是一个很好的例子。公元前,理性的思考

在线示例:已更新

请尝试wordwrap:


+1为有趣的旁白。。。该死-希望你有一个手机,允许“全部删除”,而不仅仅是个人删除,但我花了3.40美元在Twilio上换钱,因为Loll,难道他们没有办法在你的代码“上线”之前免费测试吗?也许是他们的疏忽?我相信是的,但是,由于问题只是如何将一个长字符串拆分成一个数组,我可以对其进行迭代,因此我在操场上编写了一个脚本,而不是处理实时文件。但是,我没有复制并粘贴我的工作解决方案(以完整单词结尾的sans),而是重新输入代码——忘记了拆分的长度。墨菲定律;)@Daniel,我们为所有新客户提供30美元来测试服务。这基本上是我已经遇到的问题-问题是以一个完整的单词结束,而不是一个片段。这看起来可能很理想,explode()中的| | | | | | |背后的故事是什么?基本上wordwrap用一定的字符分隔字符串,这就是你想要的,但它不会将它们分割成一个数组,它主要用于段落保持在一个边距内,你通常会使用像“
”这样的想法,
| | |
的原因是它的唯一性,所以当我们按它分解时,我们得到数组中的分割段,有单词边界和
| | | | |
删除-你通常会做一些谎言
-A_secrEtSpLiT((
)使它更独特。感谢这一点,Scott..我实际上一直在学习它,直到我看到Robert的代码,它更紧凑,更容易融入到一个已经庞大的脚本中(我也要试着把它修剪一下)。我感谢你的帮助:)
$chunks = explode("||||",wordwrap($message,155,"||||",false));
$total = count($chunks);

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

$words = "this is a long sentence that needs splitting";


foreach(explode("\n", wordwrap($words, 10, "\n")) as $s) {
        echo $s . "\n";
}