Php помещает пространство перед столиками в строке (Regex)
У меня есть ряд строк, которые содержат слова, которые сгруппированы вместе, и мне нужно их разделить.
Например
ThisWasCool - это было круто
MyHomeIsHere - Мой дом здесь
Im медленно поднимаю голову вокруг регулярных выражений, и я считаю, что для этого я должен использовать preg_replace. Моя проблема заключается в объединении выражения для поиска соответствия.
Я только добрался до этого
preg_replace('~^[A-Z]~', " ", $string)
Каждая строка содержит много слов, но ТОЛЬКО первое слово содержит сгруппированные слова, поэтому использование моего примера над строкой будет
"ThisWasCool снова посетит вас" - "Это было круто, чтобы снова навестить вас"
Я сказал ему начать с самого начала и искать капиталы, но то, что я не знаю, как это сделать
- ограничивать его только первым словом каждой строки
- как повторно использовать заглавную букву в замещающей части после пробела
Ответы
Ответ 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);