拆分一长串未使用空间

问题描述:

如果我有句话是这样的:拆分一长串未使用空间

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

所以输出应该是..

  1. hello how are
  2. [a space here->] you?are you [<-a space here]
  3. fine?thanks..

所以我是否有可能在任何单词的中间分开,而不是在分离的消息的前面或末尾留有空格?如“谢谢” - >“than”和“k you”,而不是“thanks”“you”。 因为我在做一个转换函数,前面或结尾有一个空格,它会影响转换,并且转换需要空间,所以我不能忽略或删除它。

谢谢。

+0

是的,这是可能的,但你需要提出一个关于你想要分割发生的地方的规范。 – tdammers

+0

@tdammers谢谢你的答复。我可以举个很简单的例子吗?因为每条消息的长度都不一样,所以我不知道如何具体分割它。 –

+0

您没有指定您想要分割的规则。每4个字符?究竟在每个单词的中间?随机? – tdammers

我认为你不能使用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: 顺便说一句,你会更好地改变你的方法在某种程度上:)我严重怀疑你实际上必须使用这样的功能。那么..我希望你确实有一个坚实的理由,它提出了一些有趣的。

+0

谢谢你的回复。是的,你提到的问题确实存在。如果每个部分的长度都不相同,只要前后没有空格就行了。至于双空间和单个字符。我仍然在想它。 –

如果您只是想要消除前导空格和尾随空格,请考虑使用trim来分割每个结果。

如果您想将字符串拆分为精确的三分之一,则不知道剪切的位置,可能是单词,也可能是单词之间。

您的代码可以简化为:

$msg = "hello how are you?are you fine?thanks.."; 
$parts = str_split($msg, ceil(strlen($msg)/3)); 

注意ceil()是必要的,否则你可能会得到4个元素,因为四舍五入的。

+0

非常感谢Erik,我尝试了它,但仍然给我输出与上面的示例相同的输出结果? –

您可能正在寻找str_splitchunk_splitwordwrap