За последние 24 часа нас посетили 16332 программиста и 1586 роботов. Сейчас ищут 1505 программистов ...

Прописные буквы кириллицы в регулярных выражениях.

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

  1. Valery_2014

    Valery_2014 Новичок

    С нами с:
    31 янв 2015
    Сообщения:
    2
    Симпатии:
    0
    Здравствуйте.
    Помогите, пожалуйста, разобраться со следующим вопросом.
    Необходимо выбрать элементы из массива (PHP), значения которых начинается с прописной буквы (кириллицы). Запись '/^[А-Я].+/' не работает. Можно ли это обойти?
    Заранее, спасибо.
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.099
    Симпатии:
    1.243
    Адрес:
    там-сям
    кодировка какая?

    Добавлено спустя 2 минуты:
    и вообще, ты проверял свой алгоритм "выбора регуляркой из массива" на примерах, кроме прописной кириллицы?
     
  3. Valery_2014

    Valery_2014 Новичок

    С нами с:
    31 янв 2015
    Сообщения:
    2
    Симпатии:
    0
    Кодировка UTF8.
    Программа работает, но по коду '/^[А-Я]/' выбирает элемент массива значение, которого начинается и с прописной и со строчной.
    Код '/^[A-Z]/' для латинского шрифта работает корректно.

    Добавлено спустя 14 минут 18 секунд:
    Спасибо за подсказку по поводу кодировки.
    Считал, что у меня кодировка UTF8, но после проверки, оказалось, что это не так.
    Когда перекодировал в UTF8 все стало работать корректно.
    Еще раз, спасибо.
     
  4. NikolayRog

    NikolayRog Новичок

    С нами с:
    1 фев 2015
    Сообщения:
    4
    Симпатии:
    0
    Добрый день.
    Решал аналогичную задачу пол года назад.
    Подозреваю, что кодировка здесь не причем.
    Когда занимался этим, перебрал все варианты кодировки.
    При использовании кириллицы прописные и строчные мне не удалось разделить.
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    NikolayRog, может быть флаг i всему был виной?
     
  6. NikolayRog

    NikolayRog Новичок

    С нами с:
    1 фев 2015
    Сообщения:
    4
    Симпатии:
    0
    Ganzal. флаг i я не использовал и у меня, также как и у Valery_2014, работала фильтрация строковых символов с латинским алфавитом, а вот с кириллицей не хотело работать.
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.099
    Симпатии:
    1.243
    Адрес:
    там-сям
    и что же именно у тебя было? покажи свой случай.
     
  8. NikolayRog

    NikolayRog Новичок

    С нами с:
    1 фев 2015
    Сообщения:
    4
    Симпатии:
    0
    Задача у меня была такая: должность отделить от фамилии.
    Пример:
    $a = ‘бухгалтер, Иванов' ; , $b = ‘Петров, директор ’;
    Надо автоматически разобрать эти записи.
    1. $str = preg_split('/,/', $a); // Разделяем содержимое переменной на две части по запятой.
    2. а затем, в цикле анализируя на наличие первой прописной буквы в каждом элементе массива.

    if (preg_match('/^[А-Я]/' , $str[0])) {$c[0] = $str[0] ;}

    записываем в другой массив отобранные значения.
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.099
    Симпатии:
    1.243
    Адрес:
    там-сям
    регулярка рабочая. видимо ошибка была в чем-то другом.

    Добавлено спустя 39 минут 46 секунд:
    наверное работал с UTF-8, а модификатор уникода "u" забыл прописать.

    я побаловался с твоим случаем. не знал чего делать с фактом обнаружения фамилии - сделал сортировку чтобы фамилия выходила вперед
    http://phpfiddle.org/lite/code/abng-6fir
    Код (PHP):
    1.     $ss = array_map('trim', explode(',', $line));
    2.     usort(
    3.         $ss,
    4.         function($s1, $s2) {
    5.             return preg_match('/^[А-Я]/u', $s2); // 1 если фамилия, иначе 0
    6.         }
    7.     );
    8.     $line = implode(', ', $ss);
    P.S. Можно такую регулярку для Уникода сделать: '/^\\p{Lu}/u' тогда и кириллица и латиница в верхнем регистре попадает. См. ништяки PCRE для Уникода

    P.P.S. Для windows-1251 вроде так корректней: '/^[А-ЯЁ]/' буква йо у нас особенная!
     
  10. NikolayRog

    NikolayRog Новичок

    С нами с:
    1 фев 2015
    Сообщения:
    4
    Симпатии:
    0
    Спасибо, artoodetoo.
    Все дело в модификаторе u. При использовании кодировки UTF8 (без этого модификатора) фильтр не отличает прописные и строчные в кириллице.