PHP: рамка из строки и заполнение рамок
То есть, хотим вот что
Hello, world!H ! e d l l l r o o , w w , o o r l l l d e ! H!dlrow ,olleH
Ниже показана функция на PHP, возвращающая такую разметку (обрамлённую тегом <pre>).
Размер горизонтали прямоугольника при этом равен длине строки аргумента плюс один (чтобы прямоугольник нормально замкнулся).
<?php function wordbox ($string) { $s=trim($string); $l=strlen($s); $r[]=$s.$s[0]; for ($i=1;$i<$l;$i++) { $r[$i]=" "; $r[$i][0]=$s[$l-$i]; $r[$i][$l]=$s[$i]; } $r[]=$s[0].strrev($s); return '<pre>'.join("\n",$r).'</pre>'; } echo wordbox('Hello, world!'); ?>
В чём-то схожая задача - найти в форматированном тексте рамки, ограниченные каким-либо разделителем, например, символом "#
" и заполнить их содержимое символом-заполнителем, например, точкой.
При этом вот такая область
. ############# ######### # # # # # # # # # # # # ############ # # # # # # ############# # # # # # # # # ############ # # # # # # # # ############ # # # # # # ######### # # ############
превратится в
. ############# ######### #...........# #.......# #...........# #.......# #...........# #.......# ############ #...........# #.......# #..........# ############# #.......# #..........# #.......# #..........# ############ #.......# #..........# #..........# #.......# ############ #..........# #.......# #..........# ######### #..........# ############
Вот фунция и её тест на PHP для решения задачи, как и первый листинг, код проверен на локальном хосте c установленным PHP 5.5.9.
<?php function fillbox ($string) { $s=trim($string); $s = preg_replace ("/(\G(?!^)| #) /","$1.",$s); return '<pre>'.$s.'</pre>'; } $string = ".\n". //т.к. движок блога убирает в <pre> лишние лидирующие пробелы //собственно строка теста: ' ############# ######### # # # # # # # # # # # # ############ # # # # # # ############# # # # # # # # # ############ # # # # # # # # ############ # # # # # # ######### # # ############ '; echo '<pre>'.$string.'</pre>'; echo fillbox($string); ?>
Про экранирующую последовательность \G в регулярном выражении смотрим здесь.
25.11.2018, 13:35 [1582 просмотра]