PHP вставка пробела после каждых N символов

Author Автор: Роман Чернышов    Опубликовано: 25 мая 2011

Не очень часто возникает надобность, во вставке пробела в строке, после заданного N количества символов, причем пробел необходимо вставить через каждые N символов. Но все же такая задача встречается и порой играет важную роль в проекте.

В поисках решения я воспользовался поиском и все, что нашел, к сожалению не соответствовало моим требованиям.

Более того многие примеры кода, неправильно обрабатывали кириллицу в кодировке UTF-8 (иногда вставка пробела приходилась между двумя байтами одного символа, в результате символ отображался как вопрос). В итоге пришлось немного допилить найденный мною пример:

function add_pr ($str,$count)
{
$str=iconv('UTF-8','WINDOWS-1251',$str);
$i = 0;$no_pr = 0;$j = 1;
while ($i < strlen($str))
{
$text[$j] = $text[$j].$str[$i];
if ($str[$i] == ' '){$no_pr = 0;$j = $j+1;}
if ($str[$i] != ' '){$no_pr = $no_pr+1;}
if ($no_pr == $count){$text[$j] = $text[$j].' ';$no_pr = 0;}
$i = $i+1;
}
while ($j != 0){$st = $st.$text[$j];$j = $j-1;}
$st=iconv('WINDOWS-1251','UTF-8',$st);
return $st;
}

Обратите внимания данная функция работает с текстом в кодировке WINDOWS-1251, поэтому мы предварительно конвертируем строку из UTF-8. Иначе вместо строки с расставленными пробелами можно получить сплошные каракули (или вопросы).

Надеюсь эта функция кому нибудь пригодится. Просто мысли вслух)

4 комментария to “PHP вставка пробела после каждых N символов”

  • костя 26.03.2013 в 3:10 пп

    у меня не работает, пробовал закоментить все строки
    как я понял вылетает на циклах
    страница просто перестает отображаться, решил даже так сделать:
    function add_pr($str,$count)
    {
    if (!empty($str))
    {
    $str=iconv(‘UTF-8′,’WINDOWS-1251’,$str);
    $i = 0;$no_pr = 0;$j = 1;
    $len = strlen($str);
    while ($i < $len)
    {
    $text[$j] = $text[$j].$str[$i];
    if ($str[$i] == ‘ ‘){$no_pr = 0;$j = $j+1;}
    if ($str[$i] != ‘ ‘){$no_pr = $no_pr+1;}
    if ($no_pr == $count){$text[$j] = $text[$j].’ ‘;$no_pr = 0;}
    $i = $i+1;
    }
    while ($j != 0)
    {
    $st = $st.$text[$j];$j = $j-1;
    }
    $st=iconv(‘WINDOWS-1251′,’UTF-8’,$st);
    return $st;
    }
    }

  • костя 26.03.2013 в 3:29 пп

    function add_pr ($str,$count)
    {
    $i = 0;
    $no_pr = 0;
    $j = 1;
    while ($i < strlen($str))
    {
    $text[$j] = $text[$j].$str[$i];
    if ($str[$i] == ' ')
    {
    $no_pr = 0;
    $j = $j+1;
    }
    if ($str[$i] != ' ')
    {
    $no_pr = $no_pr+1;
    }
    if ($no_pr == $count)
    {
    $text[$j] = $text[$j].' ';
    $no_pr = 0;
    }
    $i = $i+1;
    }
    while ($j != 0)
    {
    print $j."";
    $st = $st.$text[$j];
    $j = $j-1;
    }
    return $st;
    }

  • Виктор 02.09.2013 в 2:46 пп

    Есть решение куда проще, красивее и лучше:

    function stan($value, $offset = 3) {
    $v = (string)$value;
    $l = length($v);
    $ret = array();
    for($i=$l; $i>=0; $i—) {
    if(($i % $offset) == 0) $ret[] = » «;
    $ret[] = $v[$l-$i];
    }
    return trim(implode(null, $ret));
    }
    // $offset — через сколько символов ставить пробел!
    // Внимание, данный способ отсчитывает от конца строки, например для преобразование стоимости из 1560980 в 1 560 980 или из 5690 в 5 690
    // удачи.

    • Владимир 15.11.2022 в 2:27 дп

      function stan($value, $offset = 3) {

      $v = (string)$value;
      $l = strlen($v);
      $ret = array();
      $k=1;

      for($i=$l-1; $i>=0; $i—) {
      $k++;

      if(($k % $offset) == 0) {
      $ret[] = ‘ ‘;
      }

      $ret[] = $v[$l-1-$i];
      }
      return trim(implode(null, $ret));
      }

      echo stan(1321131113); //1 321 131 113

Оставить комментарий на Виктор

Автор блога
Роман Чернышов
Веб-разработчик,
Full Stack
Senior, Architect
PHP, JavaScript, Node.JS, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Моя книга
Книга. Веб-разработчик. Легкий вход в профессию
Печатная книга
Веб-разработчик.
Легкий вход в профессию
Купить за 159₽
Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка