PHP: разбить текстовую строку на подстроки длиной не более 40 символов без разрывов слов (пробелы или «_» между словами) - PullRequest
1 голос
/ 23 февраля 2020

Я должен создать сетку с именами файлов. Столбец сетки для имени файла имеет ширину 45 символов. Слова в именах файлов могут быть разделены пробелами («») или символами подчеркивания («_») или могут быть одним длинным словом.

Например:

Мой первый файл с в нем есть много интересного. pdf (65 symbols)

Желаемый результат:

|=========================================| 
| My fist file with a lot of interesting  |
| content in it.docx                      |
-------------------------------------------
| My_second_file is also with_a_lot_of_   |
| content_and_pictures.zip                |
-------------------------------------------
| My lovely short file.odt                |
-------------------------------------------
| SplitMeWhereverYouWantButDontSortMeOutH |
| oweverYouCanNeverNever.pdf              |

Моей первой идеей было использовать wordwrap ($fileName, 40), но это будет работать только для первого имени файла. И это не добавит необходимое форматирование. Поэтому я только выясняю, что делать с файлами короче 40 символов, используя str_pad.

Итак, мой черновой код на данный момент таков:

$grid = “|”.str_repeat(“=“,40).”|\r\n”;
foreach($filenames as $filename) {
  $grid .= “|”.str_pad($filename, 40).”|\r\n”;
  $grid .= “|”.str_repeat(“-“,40).”|\r\n”;
}

Я не знаю, как разделить другие более длинные файлы.

1 Ответ

1 голос
/ 23 февраля 2020

Вы можете использовать

preg_replace('~\s*([^\s_]{39}|.{1,39}(?![^\s_])_*)~s', "$1\n", $filename)

См. PHP demo и regex demo

Детали шаблона

  • \s* - 0+ пробелов (подлежит удалению)
  • ([^\s_]{39}|.{1,39}(?![^\s_])_*) - Группа 1:
    • [^\s_]{39} - 39 символов, кроме пробелов и подчеркивания
    • | - или
    • .{1,39} - любые от 1 до 39 символов, сколько возможно, но
    • (?![^\s_]) - сразу после символа с другим символом чем пробел или _
    • _* - 0 или более подчеркиваний.

Модификатор s позволяет . соответствовать любому символу, включая символы перевода строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...