За последние 24 часа нас посетил 17941 программист и 1646 роботов. Сейчас ищет 1461 программист ...

Хех, интересно почему регулярка работает некорректно

Тема в разделе "Регулярные выражения", создана пользователем Mr.M.I.T., 29 авг 2009.

  1. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Код (Text):
    1. #(<(?:a|link|img|script)[^>]+(?:href|src)\s*=\s*)(\'(?!(?:https?:\/\/|www\.))[^\']+\'|\"(?!(?:https?:\/\/|www\.))[^\"]+\"|(?!(?:https?:\/\/|www\.))[^\s]+(?=[\s\/>]))([^>]*\/?>)#is
    в 3 "или" который без кавычек, не пашет негативный просмотр вперёд
    при том, такая регулярка отрабатывает наура
    Код (Text):
    1. #(<(?:a|link|img|script)[^>]+(?:href|src)\s*=\s*)((?(?=[\'\"])(\'|\")(?!(?:https?:\/\/|www\.)).+?\\3|(?!(?:https?:\/\/|www\.))[^\s]+(?=[\s\/>])))([^>]*\/?>)#is
     
  2. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    оно должно найти все <a><img><link><script> в которых в начале ссылок нет http или www
     
  3. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ну где у нас тут гуры регулярщики
     
  4. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Ты бы хоть примеры выложил, на которых она некорректно отрабатывает.
    Отрывок РНР-кода, чтоль ...
    А то копать регулярку и не понимать, что конкретно там не работает ..
     
  5. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    во, вот в этом
    Код (Text):
    1. |(?!(?:https?:\/\/|www\.))[^\s]+(?=[\s\/>]))
    не пашет вот это
    (?!(?:https?:\/\/|www\.))

    а нижней регулярке, тоже самое работает
     
  6. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Вообще ужасная регулярка у вас...
     
  7. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Проблема вот в чем
    ="(?!www) работать будет
    а ="?(?!www) - нет, потому что кавычка - не обязательная, т.е. ="www тут легко матчится как "после равно и пустого места (ибо "? вполне может быть пустым местом) не следует www (а оно и не следует - там кавычка следует)

    Должно работать такое:
    #<(?:a|link|img|script)[^>]+(?:href|src)(?:=("|')|=)(?!https?://|www\.).*?\1[^>]*>#is

    Кстати, а разве src=" - вокруг равно допустимы пробелы?
     
  8. Fduch

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

    С нами с:
    1 июл 2009
    Сообщения:
    140
    Симпатии:
    0
    HTML:
    1.  
    2.     <img src = "картинко.пыынго" />
    3.  
    вполне работает.
     
  9. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    MiksIr
    погоди ка, ты на какую регулярку смотришь? ты на 1 смотри, вторая работает, там условие
    а в первой всё строго
    Код (Text):
    1. #
    2. (<(?:a|link|img|script)
    3.   [^>]+
    4.     (?:href|src)\s*=\s*) # равно всегда есть и \s*
    5.  
    6.       (\'(?!(?:https?:\/\/|www\.))[^\']+\'| # смотрим нет ли бяки после одинарной кавычкой
    7.        \"(?!(?:https?:\/\/|www\.))[^\"]+\"| # а этот после двойной
    8.          (?!(?:https?:\/\/|www\.))[^\s]+ # а вот тут, по ЛОГИКЕ должно смотреть после равно или \s*
    9.  
    10.             (?=[\s\/>]))([^>]*\/?>)
    11. #isx

    рабочая
    Код (Text):
    1. #(<(?:a|link|img|script)
    2.        [^>]+
    3.           (?:href|src)\s*=\s*)
    4.                ((?(?=[\'\"])
    5.                         (\'|\")
    6.                           (?!(?:https?:\/\/|www\.)).+?
    7.                         \\3
    8.                |
    9.                           (?!(?:https?:\/\/|www\.)) # вот тут же, тоже по логике смотрит после равно и \s*
    10.                              [^\s]+(?=[\s\/>])
    11.                 ))
    12.         ([^>]*\/?>)#isx
    это только кусок =)
     
  10. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Я не смотрел очень внимательно, если честно. Читать такие регулярки - мазохизм, проще с нуля по задаче написать =)
     
  11. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Лучше сделай регулярку для каждого тега в отдельности. И передай массив в preg_match_all. Разницы, вроде бы, не будет.
     
  12. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    MiksIr
    задача найти все img/a/link/script в которых ссылки в src/href начинаются без http/www/ftp/#
    короче относительные ссылки
    НО регулярка нужна максимально универсальная
    так что по задаче, ты всё равно писать не будешь =)
    Kreker
    там замена идёт, не выборка

    а вообще, тут без разницы что для каждого тега, что по отдельности
    вся фигня в кавычках
     
  13. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Я вообще привел такую регулярку, только пробелы вокруг равно добавить и все.
    Кстати, а что <img src="www.domain.ru/gif"> - не относительная? Попробуйте в браузере.
     
  14. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Универсальность тебе будет стоить очень дорого:
    1) Куча времени на написание нормальной регулярки
    2) В дальнейшем сложное её редактирование (практически невозможно разобраться)
    3) Ресурсоемкость

    Лучше разбить на несколько.
     
  15. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    MiksIr
    твоя не учитывает что если кавычек нет, то конец ссылки первый пробел
    да ещё кое чё, вообщем, твоя не универсальная

    не, эта ссылка не относительная, она с доменом
    Kreker
    одна регулярка работает быстрее чем несколько(хотя смотря какая)
    свою регулярку, мне проблем не составляет редактирвоать даже если она записана в одну строку

    вообще я давно рабочую уже написал,
    тема то о том, почему же не работает проверка в первой регулярке
     
  16. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    <img src=http://www.ya.ru>
    Где тут пробел? И потом - зачем тебе конец ссылки вообще?
    Она отвечает на поставленную задачу =)
    Идите, читайте дальше... rfc всякие =) И попробуйте, сначала, проверить, а потом утверждать.
     
  17. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    MiksIr
    <img src=/blabla/bla2 style="width:1000px" aligh=left>
    зачем? мне достаточно того что мне такие ссылки не нужны
    в броузере они будут дёргаться по http + domain
     
  18. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Вообще, учитывая, что даже такая ссылка <img src="www.ya.ru/>aaa"> не валидная, то регексп можно еще более упростить
    #<(?:a|link|img|script)[^>]+(?:href|src)(?:=("|')|=)(?!https?://|www\.)[^>]*>#is
    тогда он матчит ваш пример нормально
     
  19. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    MiksIr
    это валидное значение атрибута, а значит есть щанс его встретить

    короче, меня интересует почему не работает проверка в первой регулярке
    рабочую регулярку я и сам могу вполне написать, да уже написал...
     
  20. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Не, это не валидное значение
    http://www.ietf.org/rfc/rfc2396.txt (2.4.3)
    Иначе бы известная всем регулярка выкусывания тегов <[^>]+> шла бы лесом