如果我有这样的句子:
$msg = "hello how are you?are you fine?thanks.."
我希望将其分成3(或任何数字)。
所以我这样做:
$msglen = strlen($msg);
$seperate = ($msglen /3);
$a = 0;
for($i=0;$i<3;$i++)
{
$seperate = substr($msg,$a,$seperate)
$a = $a + $seperate;
}
所以输出应该是..
hello how are
[a space here->] you?are you [<-a space here]
fine?thanks..
那么是否可以在任何单词的中间分开而不是在分隔的消息的前面或末尾有空格?
例如“谢谢” - &gt; “比”和“k你”而不是“谢谢”“你”。 因为我正在进行转换功能并且前面或后面有空格会影响转换,转换需要空间,所以我不能忽略或删除它。
感谢。
答案 0 :(得分:1)
我认为你不能使用trim,因为连接字符串形成的消息必须保持不变?
这可能会变得复杂。您可以在拆分后制作测试空间的内容,如果检测到空格,则可以提前拆分一个字符。相当容易,但如果你有两个空间怎么办?还是一个字母?你当然可以用这种方式递归测试,但最后你可能会得到彼此截然不同的分裂字符串。
您需要正确定义要在其中运行的约束。
请准确说明您想要做什么 - 您希望每个部分都相同吗?是否在比这更高优先级的单词之间进行分裂,以便长度无关紧要?
编辑: 然后,如果你不担心长度,你可以做这样的事情[从Eriks代码开始,然后通过在空间中移动来改变长度:
$msg = "hello how are you?are you fine?thanks..";
$parts = split_without_spaces ($msg, 3);
function split_without_spaces ($msg, $parts) {
$parts = str_split(trim($msg), ceil(strlen($msg)/$parts));
/* Used trim above to make sure that there are no spaces at the start
and end of the message, we can't do anything about those spaces */
// Looping to (count($parts) - 1) becaause the last part will not need manipulation
for ($i = 0; $i < (count($parts) - 1) ; $i++ ) {
$k = $i + 1;
// Checking the last character of the split part and the first of the next part for a space
if (substr($parts[$i], -1) == ' ' || $parts[$k][0] == ' ') {
// If we move characters from the first part to the next:
$num1 = 1;
$len1 = strlen($parts[$i]);
// Searching for the last two consecutive non-space characters
while ($parts[$i][$len1 - $num1] == ' ' || $parts[$i][$len1 - $num1 - 1] == ' ') {
$num1++;
if ($len1 - $num1 - 2 < 0) return false;
}
// If we move characters from the next part to the first:
$num2 = 1;
$len2 = strlen($parts[$k]);
// Searching for the first two consecutive non-space characters
while ($parts[$k][$num2 - 1] == ' ' || $parts[$k][$num2] == ' ') {
$num2++;
if ($num2 >= $len2 - 1) return false;
}
// Compare to see what we can do to move the lowest no of characters
if ($num1 > $num2) {
$parts[$i] .= substr($parts[$k], 0, $num2);
$parts[$k] = substr($parts[$k], -1 * ($len2 - $num2));
}
else {
$parts[$k] = substr($parts[$i], -1 * ($num1)) . $parts[$k];
$parts[$i] = substr($parts[$i], 0, $len1 - $num1);
}
}
}
return ($parts);
}
这会处理多个空格和单个字母字符 - 但是如果它们存在,则部件的长度可能非常不均匀。在极端情况下它可能会搞砸 - 如果你有一个主要由空格组成的字符串,它可能会返回一个部分为空,或者如果它根本无法管理分裂则返回false。请彻底测试一下。
EDIT2: 顺便说一下,以某种方式改变你的方法会好得多:)我很怀疑你实际上必须在这个实际上使用这样的函数。嗯..我希望你确实有一个坚实的理由,它提出它有点有趣。
答案 1 :(得分:0)
如果您只是想消除前导和尾随空格,请考虑在分割的每个结果上使用trim。
答案 2 :(得分:0)
如果你想将字符串拆分为精确的三分之一,则不知道剪切的位置,可能是单词,也可能是单词之间。
您的代码可以简化为:
$msg = "hello how are you?are you fine?thanks..";
$parts = str_split($msg, ceil(strlen($msg)/3));
请注意,ceil()
是必需的,否则由于四舍五入,您可能会获得4个元素。
答案 3 :(得分:0)
您可能正在寻找str_split
,chunk_split
或wordwrap
。