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. Иначе вместо строки с расставленными пробелами можно получить сплошные каракули (или вопросы).

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

3 комментария 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
    // удачи.

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

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

Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

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