Не работает регулярное выражение

Тема в разделе "Как сделать...", создана пользователем verfaa, 14 май 2020.

XEvil 4.0 Релиз Состоялся!
  1. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    407
    Симпатии:
    47
    Написал простую регулярку на фильтрацию строк, содержащих русские слова.
    Код:
    #^[\p{Cyrillic}\s0-9\-]+$#
    Потестил её на https://regex101.com/ - работает.
    Добавил в свой код - не работает... Не могу понять почему, нашёл онлайн компилятор PHP, потестил на нём код - действительно не работает!

    Код:
        $res = "вопрос";
        if(preg_match("#^[\p{Cyrillic}\s0-9\-]+$#", $res)){
          echo 'Good';
        } else {
          echo 'Bad';
        }
    Выдаёт Bad, хотя в переменной $res только русские символы, должна писать Good. Почему?
    http://sandbox.onlinephpfunctions.com/code/07479a932b8b77d28cb07bc36a9ad906ff1da22e
     
  2. Албибеков

    Албибеков Создатель

    Регистр.:
    24 июн 2016
    Сообщения:
    21
    Симпатии:
    14
    Пробуй
    PHP:
    <?php
    $res 
    "Ростов-на-Дону";
        if(
    preg_match('#[А-Яа-я\-]+#'$res)){
          echo 
    'Good';
        } else {
          echo 
    'Bad';
        }
    ?>
     
  3. _kot

    _kot

    Регистр.:
    16 ноя 2018
    Сообщения:
    160
    Симпатии:
    192
    Как на счет кодировки на странице, не забыл?)
     
  4. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    280
    Симпатии:
    347
    Если строка в кодировке UTF-8, то в шаблон нужно добавить модификатор u (PCRE_UTF8).


    Такой шаблон пропустит много лишнего.
    PHP:
    <?php
    $res 
    "ΫΣΩ";
        if(
    preg_match('#^[А-Яа-я\-]+$#'$res)){
          echo 
    'Good';
        } else {
          echo 
    'Bad';
        }
    http://sandbox.onlinephpfunctions.com/code/5cde828062cf268eaaa38eeaf4c24717d033db61
     
    verfaa нравится это.
  5. Албибеков

    Албибеков Создатель

    Регистр.:
    24 июн 2016
    Сообщения:
    21
    Симпатии:
    14
    А так?
    PHP:
    $res "Ежик";
        if(
    preg_match('/^[а-яё0-9]+$/iu'$res)){
          echo 
    'Good';
        } else {
          echo 
    'Bad';
        }