С теми же предостережениями, которые указаны в комментариях по поводу угадывания, не видя код:
mb_strlen($word, 'UTF-8')
, и если оно превышает произвольное количество символов, циклически перебирает буквы
Я подозреваю, что вы действительно просматриваете байты. Это то, что произойдет, если вы используете обозначение доступа к массиву в строке.
Когда вы используете многобайтовую кодировку, такую как UTF-8, буква (или, в более общем случае, «символ») может занимать более одного байта памяти. Если вы вставите или удалите середину последовательности байтов, вы получите искаженные результаты.
Вот почему вы должны использовать mb_strlen
, а не просто старый strlen
. Некоторые языки имеют собственный строковый тип Unicode, где каждый элемент является символом, но в PHP строки полностью основаны на байтах, и если вы хотите взаимодействовать с ними посимвольно, вы должны использовать функции mb_string . В частности, чтобы прочитать один символ из строки, вы используете mb_substr
, и вы бы зациклили свой индекс от 0 до mb_strlen
.
Вероятно, было бы проще взять совпавшее слово и использовать замену регулярного выражения для вставки мягкого дефиса между каждой последовательностью. Вы можете получить поддержку многобайтовых строк для регулярных выражений, используя флаг u
. (Это работает только для UTF-8, но UTF-8 - единственная многобайтовая кодировка, которую вы когда-либо захотите использовать.)
const SHY= "\xC2\cAD"; // U+00AD Soft Hyphen encoded as UTF-8
$wrappableword= preg_replace('/.{3}\B/u', '$1'.SHY, $longword);