공간

2011-11-19 2 views
1

를 사용하지 않는 긴 문자열을 분할합니다. 공간

그래서 나는이 일을 해요 :

$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..

을 그렇다 내가 분리 된 메시지의 앞이나 뒤에 공백이있는 대신 단어의 중간에서 분리 할 수 ​​있습니까?

"감사합니다"대신 "감사합니다"-> "보다"와 "당신을"감사합니다. 변환 함수를 수행 중이므로 앞이나 뒤에 공백이 있으면 변환에 영향을 미치고 변환을 위해 공간이 필요하므로 무시하거나 삭제할 수 없습니다.

감사합니다.

+0

예, 가능하지만 분할을 수행 할 위치를 지정해야합니다. – tdammers

+0

@tdammers 답장을 보내 주셔서 감사합니다. 매우 짧은 예가있을 수 있습니까? 모든 메시지가 다른 길이가 될 것이므로 분할하는 방법을 구체적으로 모를 것입니다. –

+0

분할 할 규칙을 지정하지 않았습니다. 4 자마다? 정확히 각 단어의 중간에? 무작위? – tdammers

답변

1

결합 된 문자열에 의해 형성된 메시지가 변경되지 않아야하기 때문에 트림을 사용할 수 없습니까?

이렇게 복잡해 질 수 있습니다. 분할 후 공간을 테스트하는 무언가를 만들 수 있습니다. 공간이 감지되면 분할을 한 문자 앞으로 만듭니다. 꽤 쉽지만, 두 공간이 함께 있다면 어떨까요? 아니면 문자 하나? 물론이 방법으로 재귀 적으로 테스트 할 수는 있지만 길이가 매우 다른 스플릿 문자열로 끝날 수도 있습니다.

내부에서 작동하게 할 제약 조건을 올바르게 정의해야합니다.

정확히 무엇을하고 싶으십니까? 각 섹션을 동일하게 만드시겠습니까? 길이가 그다지 중요하지 않도록이 단어보다 큰 우선 순위의 단어 사이에 분할이 있습니까?

편집 : 당신이 길이에 대해 걱정하지 않을 경우 그런 다음, 당신이 이런 일을 할 수있는 [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 : 그건 그렇고, 당신이 어떤 식 으로든 당신의 접근 방식을 바꾸는 것이 훨씬 더 좋을 것입니다. 저는 실제로 당신이 실제로 이런 기능을 실제로 사용해야한다는 것을 진지하게 생각합니다. 글쎄 .. 당신이 실제로 그럴만한 이유가 있었으면 좋겠어.

+0

답장을 보내 주셔서 감사합니다. 네 말이 맞아서 언급 한 문제가 존재합니다. 각 부분의 길이가 다르면 앞면과 뒷면에 공백이없는 한 괜찮습니다. 이중 공백 및 단일 문자와 마찬가지로. .. 나는 아직도 그것에 대해 생각하고있다. –

0

단순히 앞뒤 공백을 제거하려면 각 분할 결과에 trim을 사용하십시오.

0

문자열을 정확한 3 분의 1로 분할하려는 경우 잘라내 기가 어딘지, 어쩌면 단어 사이인지 어떨지는 알 수 없습니다. 그렇지 않으면 당신 때문에 반올림의 4 개 요소를 얻을 수 있습니다, ceil()이 필요

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

하는 것으로 :

귀하의 코드를 단순화 할 수있다.

+0

정말 고마워, Erik, 나는 그것을 시험해 보았지만, 여전히 위의 예와 같은 출력을 내게 주었다. –