Вставить пробел перед символом верхнего регистра в php

Имеется такой код:

$my_str = 'ThisIsJustString'
for ($i = 0; $i < strlen($my_str); $i++)
                {
                    if (ctype_upper($my_str[$i]) && $i!=0)
                    {
                        $splitted_str = str_split($my_str, $i);
                        $result_str = implode(" ", $splitted_str);
                    }

                }

Он у меня разделяет перед последним символом верхнего регистра, а мне нужно перед каждым. Как это можно сделать?


Ответы (3 шт):

Автор решения: Алексей Шиманский

Логика такова:

  1. Бежим циклом по каждому символу строки
  2. На каждой итерации сравниваем текущий символ и его значение в верхнем регистре (т.е. символ по индексу $i равен strtoupper(символ по индексу $i))
  3. Если п.2 выдаёт true, то в строку с номером $i - 1 добавляем пробел а также прибавить к $i единичку, т.к. если не прибавить, то на итерации цикл попадёт опять на тот же символ (из-за смещённой строки) и цикл может стать бесконечным

Чтобы не пришлось мудрить как в п.3, можно создать новую переменную перед циклом. Новую строку и конкатенировать символы предыдущей в неё, а при условии соблюдения п.2 конкатенировать в переменную пробел и символ по индексу

→ Ссылка
Автор решения: Виктор

Проще так:

$my_str = 'ThisIsJustString';
$result_str = '';
for ($i = 0; $i < strlen($my_str); $i++)
{
    if (ctype_upper($my_str[$i]) && $i!=0)
    {
        $result_str .= ' ';
    }
    $result_str .= $my_str[$i];
}

print($result_str);

Output: This Is Just String

→ Ссылка
Автор решения: Anton Mironov

Можно воспользоваться регуляркой:

$my_str = 'ThisIsJustString';
$result_str = preg_replace('/(?<! )(?<!^)[A-Z]/',' $0', $my_str);
       
echo $result_str;  // This Is Just String
→ Ссылка