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

时间:2011-07-14 22:12:43

标签: php

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

但是,我遇到了技术设计问题。我确信它很容易解决,但我之前没有遇到过这个问题所以我在黑暗中迷失了。

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

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

相当简单,我确信,但这是我的第一枪 - 所以任何帮助都非常感谢!谢谢!

4 个答案:

答案 0 :(得分:6)

$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个字符,但它会使计算变得相当简单。

答案 1 :(得分:0)

我没有测试过这个,但是有点像:

$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);
}

答案 2 :(得分:0)

    $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

关闭袖口 - 但这应该很接近。

答案 3 :(得分:0)

在不知道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个字符的消息,如果您需要发送大于此的消息,则需要将$maxLen - 5更改为$maxLen - 7以便允许它正确格式化数字部分。如果您希望发送大于16000的消息,则需要将其更改为$maxLen - 9,依此类推,等等。