За последние 24 часа нас посетили 18287 программистов и 1597 роботов. Сейчас ищут 897 программистов ...

Не работает регулярное выражение вставляемое в перем-ю из БД

Тема в разделе "PHP и базы данных", создана пользователем severuga, 7 фев 2011.

  1. severuga

    severuga Активный пользователь

    С нами с:
    7 фев 2011
    Сообщения:
    6
    Симпатии:
    0
    Приветствую всех. Есть база данных PGSQL со списком регулярных выражений по которым необходимо осуществлять поиск совпадений. Подставляю выражение из базы в переменную, затем в preg_match и не работает... добавляю руками - работает.
    Выражение хранится в базе в поле 'mask', в виде '/[aAbB][\daAbB]:[aAbB][\daAbB]/'
    Выражений много и будут добавляться. Хранятся как varchar.

    Примеры:

    Не работает:
    $a = pg_result($resultmatch,0,'mask');
    $b = "a1:b1";
    if (preg_match($a,$b)) { echo "1"; }
    else { echo "0"; }

    Работает:
    $a = '/[aAbB][\daAbB]:[aAbB][\daAbB]/';
    $b = "a1:b1";
    if (preg_match($a,$b)) { echo "1"; }
    else { echo "0"; }

    Почему?

    Может в данном примере с ковычками накосячил, но сути не меняет, если из базы подставляю не фурычит... ручками вбиваю работает.
     
  2. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    а ты попробуй распечатать переменную с регуляркой до того, как вставлять в поиск
     
  3. severuga

    severuga Активный пользователь

    С нами с:
    7 фев 2011
    Сообщения:
    6
    Симпатии:
    0
    Во время написания, обычно все переменные раcпечатываю.
    Поменял тип переменной на
    $a=(string)$a; также не помогает.
    и
    $b=(string)$b; тоже попробовал.
     
  4. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    $a = pg_result($resultmatch,0,'mask');
    die($a);
    $b = "a1:b1";
    if (preg_match($a,$b)) { echo "1"; }
    else { echo "0"; }


    и посмотри что пишет
     
  5. severuga

    severuga Активный пользователь

    С нами с:
    7 фев 2011
    Сообщения:
    6
    Симпатии:
    0
    Пишет: '/[aAbB][\daAbB]:[aAbB][\daAbB]/'
     
  6. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    а что возвращает функция pg_result ?

    прям так с кавычками и пишет?
     
  7. severuga

    severuga Активный пользователь

    С нами с:
    7 фев 2011
    Сообщения:
    6
    Симпатии:
    0
    В результате обращения к базе комадной $resultmatch, я получаю массив (если несколько совпадений то многомерный но в данном случае совпадение одно) из которого комадной pg_result из "0" нулевой строки, забираю значение поля 'mask'.

    Сделал проще, создал маску '/a1:b1/' не находит совпадений!
     
  8. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    severuga
    ППЦ.

    храни в базе без кавычек. а ещё погугли по флагам для регулярки, особенно про игнорирование регистра, чтобы не писать [aA], достаточно просто a
     
  9. severuga

    severuga Активный пользователь

    С нами с:
    7 фев 2011
    Сообщения:
    6
    Симпатии:
    0
    Я сосздал маку в нижнем регистре без ковычек a1:b1 запихнул в базу.

    Изменил программу:
    $a = pg_result($resultmatch,0,'mask');
    $b = "a1:b1";
    if (preg_match('/$a/',$b)) { echo "1"; }
    else { echo "0"; }

    не работает!
     
  10. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    severuga
    переменные внутри одинарных кавычек не интерпретируются. сделай так:
    if (preg_match("/$a/",$b)) { echo "1"; }


    (сообщение было отмодерировано, стёрто 8 строчек мата)
     
  11. severuga

    severuga Активный пользователь

    С нами с:
    7 фев 2011
    Сообщения:
    6
    Симпатии:
    0
    Итить заработало!

    Спасибо Gromo, учту для себя на будущее что с этим могут быть проблемы. Но я тоже не просто так их использовал, куча примеров на php.net именно с одинарными кавычками, у меня во многих приложениях работают именно в одинарными кавычками.
    Ещё раз спасибо! :)
     
  12. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    severuga
    если внутри строки пишешь переменную, то строку нужно заключать в двойные кавычки!

    $text = 'abc'
    echo 'here is the $text'; // here is the $text
    echo 'here is the '.$text; // here is the abc
    echo "here is the $text"; // here is the abc