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

Тема в разделе "Регулярные выражения", создана пользователем d0ublezer0, 9 ноя 2016.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. d0ublezer0

    d0ublezer0

    Регистр.:
    21 май 2009
    Сообщения:
    261
    Симпатии:
    151
    Привет!
    помогите составить регулярку на PHP?
    я только начал изучать эту тему, а мозг уже сломался

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

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

    Вероятно что-то такое должно быть, но выделяется в том числе и JLL, что мне не подходит
    Код:
    \b[А-ЯA-Z]+\b
    
     
  2. Saharov

    Saharov Писатель

    Регистр.:
    17 окт 2016
    Сообщения:
    1
    Симпатии:
    0
    делишь по пробелу на строки
    preg_split("/(?!\S)\b/", $input_line);
    ищешь только капс
    preg_match("/^[A-Z]*$/", $input_line, $output_array);
     
  3. d0ublezer0

    d0ublezer0

    Регистр.:
    21 май 2009
    Сообщения:
    261
    Симпатии:
    151
    А дальше уже имея массив строк, делаю капитализацию и прогоняю 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
     
    Последнее редактирование: 9 ноя 2016
  4. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    245
    Симпатии:
    321
    Можно сократить до одного 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;
     
    d0ublezer0, latteo, dmx и ещё 1-му нравится это.
Статус темы:
Закрыта.