Разбивка строки по длинее и переносу строки

163
15 октября 2018, 22:00

Есть такая функция, которая разбивает строку на части заданной длинны:

function split($str, $len = 5) {
  $arr    = [];
  $length   = mb_strlen($str, 'UTF-8');
  for ($i = 0; $i < $length; $i += $len) 
  {
    $arr[] = mb_substr($str, $i, $len, 'UTF-8');
  }
  return $arr;
}

На выходе получается массив состоящий из строк длинною до 5 символов.

Нужно модифицировать функцию таким образом, чтобы одним из условий переноса был символ новой строки /n. Тоесть, перенос совершается в рамках 5 символов, но если встречается знак переноса, делаем разбитие в этом месте. Это нужно чтобы перенос по возможности не рвал слова на части

Те, если исходная строка имеет вид,

$str = '12345/n9101111/n2';

на выходе должно получаться:

1=>12345 (5)
2=>678/n (4)
3=>91011 (5)
4=>11/n (3)
5=>2 (1)

Уточнение: Например есть строка длинною 150 символов, ее нужно разбить на блоки максимальной длинною 50 символов, в строке встречаются переносы на новую строку. Задача разбить строку на такое количество блоков максимальной длинной 50 символов чтобы как можно меньше "разрывать" слова по возможности разбивая блоки на местах переноса строки, пусть они будут и короче 50 символов. Но в случае если переносы строки не встречаются, то разбивать на последнем пробеле. Ну или если уж нет пробелов, то тогда разбивать на 50-м символе. Скриншот тут иллюстрирует проблему i.stack.imgur.com/EqfmR.jpg

Answer 1
function chunk_split_unicode($str, $l = 5, $e = "\r\n", $last = FALSE) {
    $tmp = array_chunk(preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $l);
    $res = [];
    $count = (count($tmp) - 1);
    foreach ($tmp as $k => $t) {
        $res[] = (($count != $k) OR ($last)) ? implode('', $t) : implode('', $t) . $e;
    }
    return $res;
}
function new_split($str, $len = 5) {
    $arr = [];
    $str = explode(PHP_EOL, $str);
    $count = (count($str) - 1);
    foreach ($str as $k => $value) {
        $arr = array_merge($arr, chunk_split_unicode($value, $len, PHP_EOL, ($count != $k) ? FALSE : TRUE));
    }
    return $arr;
}
$str = '12345678
9101111
2';
var_dump(new_split($str));
Answer 2
$str = "12345\n9101111\n2";
preg_match_all('~.{1,5}\n?~', $str, $m);
$ret = array_map(function($s){ return rtrim($s, "\n"); }, $m[0]);
var_dump($ret);

Возвращает

array(4) {
  [0]=>
  string(5) "12345"
  [1]=>
  string(5) "91011"
  [2]=>
  string(2) "11"
  [3]=>
  string(1) "2"
}
READ ALSO
Yii2 Все товары в подкатегориях

Yii2 Все товары в подкатегориях

Вообщем такая проблема, есть проект на yii2 там есть категории с бесконечной вложенностью и такая задача вывести все товары из данной под категории...

159
Как спарсить данные с сайта, если стоит blazingfast.io

Как спарсить данные с сайта, если стоит blazingfast.io

Не удается спарсить данные с https://anistarme/

172
Не полный перенос строки в потоке ввода

Не полный перенос строки в потоке ввода

Нужно отформатировать номер телефона в формате +XXX-YYY-ZZZZZZ и распределить по аргументам номера страны, региона и области, при этом номера между...

206
проблема с файлом glut.h

проблема с файлом glut.h

Здраствуйте, при написании кода на OpenGL, у меня возникла проблема с файлом gluth

166