결합 된 문자열에 의해 형성된 메시지가 변경되지 않아야하기 때문에 트림을 사용할 수 없습니까?
이렇게 복잡해 질 수 있습니다. 분할 후 공간을 테스트하는 무언가를 만들 수 있습니다. 공간이 감지되면 분할을 한 문자 앞으로 만듭니다. 꽤 쉽지만, 두 공간이 함께 있다면 어떨까요? 아니면 문자 하나? 물론이 방법으로 재귀 적으로 테스트 할 수는 있지만 길이가 매우 다른 스플릿 문자열로 끝날 수도 있습니다.
내부에서 작동하게 할 제약 조건을 올바르게 정의해야합니다.
정확히 무엇을하고 싶으십니까? 각 섹션을 동일하게 만드시겠습니까? 길이가 그다지 중요하지 않도록이 단어보다 큰 우선 순위의 단어 사이에 분할이 있습니까?
편집 : 당신이 길이에 대해 걱정하지 않을 경우 그런 다음, 당신이 이런 일을 할 수있는 [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 : 그건 그렇고, 당신이 어떤 식 으로든 당신의 접근 방식을 바꾸는 것이 훨씬 더 좋을 것입니다. 저는 실제로 당신이 실제로 이런 기능을 실제로 사용해야한다는 것을 진지하게 생각합니다. 글쎄 .. 당신이 실제로 그럴만한 이유가 있었으면 좋겠어.
예, 가능하지만 분할을 수행 할 위치를 지정해야합니다. – tdammers
@tdammers 답장을 보내 주셔서 감사합니다. 매우 짧은 예가있을 수 있습니까? 모든 메시지가 다른 길이가 될 것이므로 분할하는 방법을 구체적으로 모를 것입니다. –
분할 할 규칙을 지정하지 않았습니다. 4 자마다? 정확히 각 단어의 중간에? 무작위? – tdammers