Pull to refresh

Замена двух последних символов в слове на звездочки

Этю́д (фр. étude «изучение») — инструментальная пьеса, как правило, небольшого объёма, основанная на частом применении какого-либо трудного приёма исполнения и предназначенная для усовершенствования техники исполнителя. (с) wikipedia

Первое, что приходит в голову — переменная типа string является массивом символов типа char, поэтому достаточно заменить последние два индекса:
<?php
$str = 'testWord';
$str_length = strlen($str);
$str[$str_length-1] = '*';
$str[$str_length-2] = '*';
echo $str;
?>


Задача решена в лоб, код плохо читается, так как совершается два однотипных действия.

Второй вариант более изощренный: стандартной функцией substr() удаляем два последних символа и добавляем две звездочки:
<?php
$str = 'testWord';
$str = substr($str,0, strlen($str)-2).'**';
echo $str;
?>


Вариант рабочий, но не нравится, что приходится делать конкатенацию строк, из-за чего опять страдает читаемость кода.

Третий вариант также использует стандартную функцию substr_replace(), которая заменяет одни подстроки на другие:
<?php
$str = 'testWord';
$str = substr_replace($str,'**',strlen($str)-2);
echo $str;
?>


Хороший вариант, но используется функция strlen(), поэтому открываем руководство по php и смотрим синтаксис функции substr_replace():
string substr_replace(string str, string replacement, int start [, int length])
Эта функция заменяет в исходной строке одни подстроки на другие. Она возвращает строку str, в которой часть от символа с позицией start и длиной length заменяется строкой replacement. Если аргумент длины length не указан, замена проводится до конца.

Если значение аргумента start положительно, то отсчет производится от начала строки str, в противном случае — от конца. В случае неотрицательного значения length, оно указывает длину заменяемого фрагмента. Если же оно отрицательно, то это — число символов от конца строки str до последнего символа заменяемого фрагмента.


И тогда конечный вариант:
<?php
$str = 'testWord';
$str = substr_replace($str,'**',-2);
echo $str;
?>


Можно было также воспользоваться регулярными выражениями, что работает немного медленнее конечного результата:
<?php
$str = 'testString';
$pattern = "|.{2}$|si";
$replace = '**';
$str = preg_replace($pattern,$replace,$str);
echo $str;
?>
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.