ФорумПрограммированиеPHP для идиотов → Не работает регулярка если загрузить ее из файла

Не работает регулярка если загрузить ее из файла

  • Siddartha

    Сообщения: 6 Репутация: N Группа: Кто попало

    Spritz Дек. 14, 2007, 3:57 п.п.

    Здравствуйте, уважаемые форумчане.
    Задача такая - парсить HTML код и выдирать из него регулярками части.
    Регулярку написал.
    preg_match("/<a[^>]*><img[^>]*src\\s*=\\s*([\\\"\\\'])?(?(1)(.*?)\\\\1|([^\\s\\>]+))/isx", $html, $match);
    . Вот так все работает. Но мне надо хранить регулярку в файле с возможностью изменения пользователем. И если ее из файла считать в переменную, и писать уже вот так:
    preg_match($regexp, $html, $match);
    , то она не выводит то что ранее.
    Вывел обе регулярки на страницу и заметил странность.
    src\\s*=\\s*([\\\"\\\'])?(?(1) - вот так выглядит регулярка, считанная из файла.
    src\\s*=\\s*([\"\\\'])?(?(1) - а вот так - когда просто строкой.
    Как видно в первом случае не считается, что слеш перед \" просто их отменяет, а во втором соотв. \\\" заменяется на \".
    Чего я не учитываю?
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz Дек. 14, 2007, 4:37 п.п., спустя 40 минут 10 секунд

    В файле просто пиши все без экранирования, нужна кавычка - пиши кавычку без всяких бэкслешей. Нужен один бэкслеш - пиши бэкслеш.

    Кстати, вопрос к регуляркам как таковым не имеет ни малейшего отношения.
  • kendo

    Сообщения: 446 Репутация: N Группа: Адекваты

    Spritz Дек. 14, 2007, 4:42 п.п., спустя 4 минуты 48 секунд

    Иногда php сам экранирует строку. В таком случае нужно ее обрабатывать stripslashes();
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz Дек. 14, 2007, 4:46 п.п., спустя 4 минуты 11 секунд


    Иногда php сам экранирует строку. В таком случае нужно ее обрабатывать stripslashes();
    Иногда - это звучит круто! Осталось только разобраться относится ли к этому "иногда" чтение из файла. :)
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz Дек. 14, 2007, 4:50 п.п., спустя 4 минуты 18 секунд

    Ну, иногда относится :)
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz Дек. 14, 2007, 5:04 п.п., спустя 13 минут 11 секунд


    Ну, иногда относится :)
    Действительно. Правда это очень, очень редкое и вымирающее "иногда" … От греха подальше, начинающим программистам лучше даже не знать про него. :)
  • Siddartha

    Сообщения: 6 Репутация: N Группа: Кто попало

    Spritz Дек. 14, 2007, 5:06 п.п., спустя 2 минуты 10 секунд

    Спасибо большое KENDO. Дело было именно в этом.
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz Дек. 14, 2007, 5:09 п.п., спустя 2 минуты 42 секунды


    Спасибо большое KENDO. Дело было именно в этом.
    Есть у меня подозрение, что ты так ничего и не понял … Жаль
  • Siddartha

    Сообщения: 6 Репутация: N Группа: Кто попало

    Spritz Дек. 14, 2007, 5:16 п.п., спустя 7 минут 6 секунд

    Есть у меня подозрение, что ты так ничего и не понял … Жаль

    Так я с удовольствием попробую разобраться. Просто уже заработало, а почему, расскажи плиз. Всегда открыть знаниям.
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz Дек. 14, 2007, 5:22 п.п., спустя 6 минут 1 секунду

    Потому что все конструкции типа \" \\ внутри кавычек в пхп коде нужны для того, чтоб транслятор мог отличить их от закрывающейся кавычки и экранирующего бэкслеша.

    Т.е. когда ты пишешь
    $a = "\\\"";
    в переменную на самом деле попадает, только \"
    Т.е. это часть синтаксиса языка PHP, а не часть синтаксиса регулярных выражений.

    При чтении из файла - ты читаешь ровно то что там написано, никакого анализа не проводится (не рассматриваем случай на который указал vasa_c ввиду крайней экзотичности). т.е. пишешь туда сразу \"

    Ты же, как я понял, сначала добавил в файл лишние бэкслеши, потом удалил их через stripslashes т.е. проделал двойную бессмысленную работу.
  • Siddartha

    Сообщения: 6 Репутация: N Группа: Кто попало

    Spritz Дек. 14, 2007, 5:57 п.п., спустя 35 минут 43 секунды

    Как раз нет. В файл я копировал строчку регулярки как она есть в тексте скрипта. И тем не менее при чтении из файла видать что-то такое происходило. Для ясности стоит сказать что тестировал дома на денвере. Может там и есть тот самый экзотичный случай…
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz Дек. 14, 2007, 6:01 п.п., спустя 3 минуты 10 секунд


    В файл я копировал строчку регулярки как она есть в тексте скрипта.

    Блин! Еще раз!
    У тебя в тексте скрипта не строка регулярки, а строка подготовленая таким образом, чтоб PHP транслятор мог ее преобразовать в регулярку, при разборе содержимого кавычек.
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz Дек. 14, 2007, 7:06 п.п., спустя 1 час 5 минут 34 секунды


    magic_quotes
    О, господи! Да причем здесь magic_quotes? :( :( :(

Пожалуйста, авторизуйтесь, чтобы написать комментарий!