我目前正在开发一个接收消息的脚本,每100个字符左右将其拆分,并发送每个部分。
但是,我原来的字符串中有“\ n”行,这导致我的preg_split出现问题,导致它过早地分裂(例如,在100个字符之前)。
以下是我目前正在使用的内容:
$sMessage = "Msg from John Smith \n".
"SUBJ: Hello! \n".
"This is the bulk of the message and can be well over 200 or 300 characters long. \n".
"To reply, type R 131, then ur msg.";
$split = preg_split('/(.{0,100})\s/',
$sMessage,
0,
PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
array_shift($split);
$count = count($split);
foreach ($split as $key => $message) {
$part = sprintf("(%d/%d) %s", $key+1, $count, $message);
echo $part;
echo "<br>";
}
现在,有了这个,我注意到了三件事:
1)消息的第一部分(“John Smith的消息”)甚至没有包含在数组中。
2)新行(\ n)似乎提前剪掉了字符串。
3)奇怪的是,对于消息的最后一行(“回复”等等),它会切断最后一个单词(“msg。”)并将其添加到一个新行中,无论句子是什么可能会读。
对此的任何帮助都会很棒!
答案 0 :(得分:2)
您实际上正在尝试重新实现函数wordwrap()
。我认为完成你需要的工作的电话会是这样的:
$array = explode("\n", wordwrap($string, 100, "\n", true));
答案 1 :(得分:1)
我原来的字符串中有“\ n”行
使用PCRE_DOTALL修饰符允许“。”匹配换行符。
使用str_split可以更轻松地将字符串分块为固定长度字符串数组。正如soulmerge建议的那样,如果那是你真正想做的事情,那么wordwrap可能会更好。您可以使用explode将字符串拆分为数组。
避免使用字符串处理函数可用的正则表达式。 (而PHP有很多。)