拆分一长串未使用空间
如果我有句话是这样的:拆分一长串未使用空间
$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..
所以我是否有可能在任何单词的中间分开,而不是在分离的消息的前面或末尾留有空格?如“谢谢” - >“than”和“k you”,而不是“thanks”“you”。 因为我在做一个转换函数,前面或结尾有一个空格,它会影响转换,并且转换需要空间,所以我不能忽略或删除它。
谢谢。
我认为你不能使用trim,因为由联合字符串形成的消息必须保持不变?
这可能会变得复杂。你可以在分割之后做一些测试空间的东西,如果检测到一个空格,可以提前分割一个字符。相当容易,但如果你有两个空间在一起呢?还是单字母字?你当然可以用这种方式递归地测试,但是最后你可能会得到彼此截然不同的长度分割的字符串。
您需要正确定义您希望它在其中起作用的约束。
请确切说明你想做什么 - 你想每个部分是平等的?是否在比这更高的优先级之间进行分割,以便长度不重要?
编辑: 然后,如果你不担心的长度,你可以做这样的事情[开始与意立码通过继续走动的空间来改变长度:
$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。请彻底测试一下。
编辑2: 顺便说一句,你会更好地改变你的方法在某种程度上:)我严重怀疑你实际上必须使用这样的功能。那么..我希望你确实有一个坚实的理由,它提出了一些有趣的。
谢谢你的回复。是的,你提到的问题确实存在。如果每个部分的长度都不相同,只要前后没有空格就行了。至于双空间和单个字符。我仍然在想它。 –
如果您想将字符串拆分为精确的三分之一,则不知道剪切的位置,可能是单词,也可能是单词之间。
您的代码可以简化为:
$msg = "hello how are you?are you fine?thanks..";
$parts = str_split($msg, ceil(strlen($msg)/3));
注意ceil()
是必要的,否则你可能会得到4个元素,因为四舍五入的。
非常感谢Erik,我尝试了它,但仍然给我输出与上面的示例相同的输出结果? –
是的,这是可能的,但你需要提出一个关于你想要分割发生的地方的规范。 – tdammers
@tdammers谢谢你的答复。我可以举个很简单的例子吗?因为每条消息的长度都不一样,所以我不知道如何具体分割它。 –
您没有指定您想要分割的规则。每4个字符?究竟在每个单词的中间?随机? – tdammers