REGEX для слов КАПСОМ

Статус
В этой теме нельзя размещать новые ответы.

d0ublezer0

Мой дом здесь!
Регистрация
21 Май 2009
Сообщения
367
Реакции
201
Привет!
помогите составить регулярку на PHP?
я только начал изучать эту тему, а мозг уже сломался

У меня задача - достать все слова из строки, которые набраны ЗАГЛАВНЫМИ и ограничены пробелами или концом строки, и преобразовать их затем в строчные с первым заглавным символом.

Например, исходная строка: "CARMEDIA VolksWagen POLO JLL-12RD HOME" (жирным выделены нужные)

Вероятно что-то такое должно быть, но выделяется в том числе и JLL, что мне не подходит
Код:
\b[А-ЯA-Z]+\b
 
делишь по пробелу на строки
preg_split("/(?!\S)\b/", $input_line);
ищешь только капс
preg_match("/^[A-Z]*$/", $input_line, $output_array);
 
делишь по пробелу на строки
preg_split("/(?!\S)\b/", $input_line);
ищешь только капс
preg_match("/^[A-Z]*$/", $input_line, $output_array);
А дальше уже имея массив строк, делаю капитализацию и прогоняю str_replace по исходной строке?

UPD:
Увы, на выходе - пустой массив:
PHP:
$input_line="CARMEDIA VolksWagen POLO JLL-12RD HOME";
    $output_array=preg_split("/(?!\S)\b/", $input_line);
    preg_match("/^[A-Z]*$/", $input_line, $output_array);
    print_r($output_array);

UPD2:
сделал так (насколько знаний хватило) но, думается мне, это можно было сильно упростить:
PHP:
$input_line="CARMEDIA   VolksWagen  POLO JLL-12RD HOME немного СЛОВ на русском языке END";
$input_line = preg_replace('/\s+/', ' ', $input_line);
$words=split(" ", $input_line);
foreach ($words as $word){
    if (preg_match('/^[А-ЯЁA-Z\W]+$/u', $word)){
        $caps[]=$word;
        $capitol[]=mb_convert_case($word,MB_CASE_TITLE,'UTF-8');
    }
}
$output_line=str_replace($caps,$capitol,$input_line);
echo $output_line;
Результат:
Код:
Carmedia VolksWagen Polo JLL-12RD Home немного Слов на русском языке End
 
Последнее редактирование:
Можно сократить до одного preg_replace_callback
PHP:
$input_line = "CARMEDIA VolksWagen POLO JLL-12RD HOME немного СЛОВ на русском языке END";

$output_line = preg_replace_callback(
    '/(?<=\s|^)[А-ЯЁA-Z]+(?=\s|$)/u',
    function ($m) {
        return mb_convert_case($m[0],MB_CASE_TITLE,'UTF-8');
    },
    $input_line
);

echo $output_line;
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху