Подтвердить что ты не робот

Php помещает пространство перед столиками в строке (Regex)

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

Например ThisWasCool - это было круто
MyHomeIsHere - Мой дом здесь

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

Я только добрался до этого

   preg_replace('~^[A-Z]~', " ", $string)

Каждая строка содержит много слов, но ТОЛЬКО первое слово содержит сгруппированные слова, поэтому использование моего примера над строкой будет "ThisWasCool снова посетит вас" - "Это было круто, чтобы снова навестить вас"

Я сказал ему начать с самого начала и искать капиталы, но то, что я не знаю, как это сделать - ограничивать его только первым словом каждой строки - как повторно использовать заглавную букву в замещающей части после пробела

4b9b3361

Ответ 1

Проблема

  • Ваше регулярное выражение '~^[A-Z]~' будет соответствовать только первой заглавной букве. Подробнее см. Мета-символы в Синтаксис шаблонов.

  • Ваша замена - символ новой строки '\n', а не пробел.

Решение

Используйте этот код:

$String = 'ThisWasCool';
$Words = preg_replace('/(?<!\ )[A-Z]/', ' $0', $String);

(?<!\ ) является assertion, который позволит нам не добавлять пробел до заглавной буквы, которая уже имеет перед ним.

Ответ 2

$string = preg_replace('/[A-Z]/', ' $0', $string);

Возможно, запустите результат ltrim после.

$string = ltrim(preg_replace('/[A-Z]/', ' $0', $string));

Ответ 3

Здесь моя .02c, эта версия будет действовать только на первое слово и сохранит последовательности прописных букв (BMW).

$str = "CheckOutMyBMW I bought it yesterday";
$parts = explode(' ', $str);
$parts[0] = preg_replace('~([a-z])([A-Z])~', '\\1 \\2', $parts[0]);
$newstr = implode(' ', $parts);
echo $newstr;

Ответ 4

Я не владею регулярным выражением, но я бы предложил что-то вроде следующего кода:

$string="ThisWasCool to visit you again";
$temp = explode(' ',$string, 2);
$temp[0] = preg_replace('/(.)([A-Z])/','$1 $2', $temp[0]);
$string = join(' ',$temp);

Глядя на код SirLancelot, у меня есть второе решение. Тем не менее, я предпочитаю решение взрыва, поскольку вы заявили, что ваша цель - это только первое слово строки.

$string="ThisWasCool to visit you again";
$temp = explode(' ',$string, 2);
$temp[0] = preg_replace('/(?<!^)([A-Z])/',' $0', $temp[0]);
$string = join(' ',$temp);