如何将超过160个字符的消息拆分为多条消息以发送短信(PHP)


How to split up a message longer than 160 chars into multiple messages for sending SMS (PHP)

我正在做一个发送SMS消息的小项目。我已经编写了消息类,并准备以正确的格式发回。

然而,我遇到了一个技术设计问题。我确信它很容易解决,但我以前从未遇到过这个问题,所以我迷失在黑暗中。

当我返回一条超过160个字符的消息时,它显然需要分解成更小的消息并单独发送。我的第一个想法显然是得到字符串长度,然后将其除以160个字符,并四舍五入到最大整数(因为你不能发送2.5条消息,只有3条(,然后每条短信都需要在消息中有1/3、2/3、3/3等,并向用户显示读取它们的顺序。(相信我,他们会需要的(

我的想法显然是使用某种循环为每个160个字符的消息创建一个"new ServiceMessage(("。但我不确定到底该怎么做,也不确定如何显示消息的计数(1/2、2/3等(。

我相信这相当简单,但这是我的第一次尝试,所以我们非常感谢任何帮助!非常感谢。

$messages = str_split($message , 160);
foreach($messages as $message){
   // send $message
}

一个更复杂的版本,消息本身的数量可以是这样的,代码是未经测试的:

if(strlen($message) > 160){
    /// lets use 152 characters and keep room for message number like (1/10), 
    /// we can have upto 99 parts of the message (99/99)
    $messages = str_split($message , 152); 
    $how_many = count($messages);
    foreach($messages as $index => $message){
        $msg_number = ($index + 1);
        $message = "(".$msg_number."/".$how_many.") ".$message;
        // send $message
    }
}
else{
    // send $message
}

上面的内容可能会在每条消息中浪费2个字符,但它使计算相当简单。

我还没有测试过,但类似于:

$len = strlen($message);
$parts = ceil($len / 160);
$last = 0;
for ($i = 1; $i <= $parts; $i++) {
    echo "Sending part " . $i . " of " . $parts;
    // Extract the next 160 characters
    $message_part = substr($message, $last, 160);
    $last += 160;
    // Send message
    new ServiceMessage($message_part);
}
    $messageSize = strlen( $message );
    $segmentSize = 160
    for ( $segment = 0; $segment * $segmentSize < $messageSize; $segment++ ) {
       $header = ($segment + 1).'/'.($messageSize / 160 + 1).' ';
       $segments[$segment] = substring( $message, 
                                        $segment * $segmentSize,
                                        $segmentSize - strlen( $header ) );
    }
//Your messages will be in the array $messages at this point

即兴表演——但这应该很接近。

如果不知道ServiceMessage类是如何工作的,我就无法真正为您提供完美的代码,但这应该非常接近您的需求。将其放入函数中将返回ServiceMessage对象或ServiceMessages对象数组。从那里开始,如果ServiceMessage类本质上没有这样做,那么就可以简单地使用您想要的函数来发送消息。

function getServiceMessage($message, $maxLen = 160)
{
    if(strlen($message) < $maxLen)
        return new ServiceMessage($message);
    $messages = explode(PHP_EOL, wordwrap($message, $maxLen - 5, PHP_EOL, TRUE));
    for ($i = 0, $j = 1, $k = count($messages); $i <= $k; ++$i, ++$j)
        $messages[$i] = new ServiceMessage("($j/$k){$messages[$i]]}");
    return $messages;
}

需要注意的是,这只适用于长度小于1600个字符的消息,如果您需要发送的消息大于1600个字符,则需要将$maxLen - 5更改为$maxLen - 7,以便正确格式化数字部分。如果您希望发送大于16000的消息,则需要将其更改为$maxLen - 9,依此类推。