БлогNot. PHP: рамка из строки и заполнение рамок

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 [1456 просмотров]


теги: программирование php

К этой статье пока нет комментариев, Ваш будет первым