PHP: разбить строку на одинаковое количество символов и, если она слишком большая, найти последнюю \ n и продолжить с нее? - PullRequest
2 голосов
/ 25 марта 2019

У меня есть довольно длинная строка. Длина строки является переменной и не статичной. Вот почему мне нужно написать динамическую функцию для моей проблемы. Тем не менее, я должен разделить мою строку на равные большие размеры. Максимальный размер на строку составляет 4096 символов.

На самом деле это довольно легко сделать:

$myArray = str_split($myMessage, 4096);

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я хочу разбивать строку после каждого символа 4096s, но также иметь ее для чтения. Итак, что я на самом деле хочу, так это функция, которая разбивает строку после 4096 символов, но затем возвращается к последнему переводу строки (\n), а затем снова оттуда.

Итак, в конце у меня есть вполне читаемая строка, которая всегда разделяется на 4096 (если символ 4096 - это \n) или последний \n.

Тем не менее, я уже гуглил, но не нашел решения .. Не могли бы вы, ребята, помочь мне и дать мне подсказку, как решить эту проблему, потому что у меня нет клея, как решить эту проблему ..

Итак, вот пример того, что я хочу в конце с максимальной длиной символа 5:

$myString = "Hey there.\nThis is a test.\nAnd this is\nhow it works."

[0] = "Hey there.\nThis is a test.\n"; //29 chars
[1] = "And this is\nhow it works.";

С уважением и благодарностью!

Ответы [ 2 ]

0 голосов
/ 25 марта 2019
$string = "Hey there.\nThis is a test.\nAnd this is\nhow it works.";
//Your long string with \n

$len = 20;
//The longest length of each chunk

$needle = "\n";
//The character you want to split the strings by

while(strlen($string)>$len){
    //as long as the string is longer than 1 chunk

    $len_chunk = substr($string, 0, $len);
    //cut away the first chunk

    $string = substr($string, $len);
    //keep the rest together

    if(!strrpos($len_chunk, $needle)){
        //in case the chunk doesn't contain a single \n character (! used instead of === FALSE by design)
        $chunks[] = $len_chunk;
        continue;
    }

    $chunks[] = substr($len_chunk, 0, strrpos($len_chunk, $needle));
    //trim away the stuff after the *last* \n

    $string = substr($len_chunk, strrpos($len_chunk, $needle)) . $string;
    //Attach the rest back to the original string
}

$chunks[] = $string;
//Add whatever is remaining in the string as the last chunk!

var_dump($chunks);

Выход:

array(4) {
  [0]=>
  string(10) "Hey there."
  [1]=>
  string(16) "
This is a test."
  [2]=>
  string(12) "
And this is"
  [3]=>
  string(14) "
how it works."
}

То, как код в данный момент, \ n приходит first в каждой последующей строке после первой. Его можно легко изменить, чтобы он был последним символом строки досягаемости, или вообще удалить.

0 голосов
/ 25 марта 2019

так что я получил это, чтобы сделать то, что вы хотели:

$myString = "Hey there.<br />This is a test.<br />And this is<br />how it works.";
$array1 = str_split($myString, 30);
$array2 = explode('<br />', $array1[0]);
for($i=0; $i<count($array2); $i++){
    echo $array2[$i].'<br />';
}

Проблема, с которой я столкнулся, заключалась в том, что строка сначала пыталась найти \n Я изменил это значение на <br />, и это было гораздо проще сделать. Не уверен, что вы сможете изменить свою строку, как это в первую очередь.

...