Код (Text): #(<(?:a|link|img|script)[^>]+(?:href|src)\s*=\s*)(\'(?!(?:https?:\/\/|www\.))[^\']+\'|\"(?!(?:https?:\/\/|www\.))[^\"]+\"|(?!(?:https?:\/\/|www\.))[^\s]+(?=[\s\/>]))([^>]*\/?>)#is в 3 "или" который без кавычек, не пашет негативный просмотр вперёд при том, такая регулярка отрабатывает наура Код (Text): #(<(?:a|link|img|script)[^>]+(?:href|src)\s*=\s*)((?(?=[\'\"])(\'|\")(?!(?:https?:\/\/|www\.)).+?\\3|(?!(?:https?:\/\/|www\.))[^\s]+(?=[\s\/>])))([^>]*\/?>)#is
Ты бы хоть примеры выложил, на которых она некорректно отрабатывает. Отрывок РНР-кода, чтоль ... А то копать регулярку и не понимать, что конкретно там не работает ..
во, вот в этом Код (Text): |(?!(?:https?:\/\/|www\.))[^\s]+(?=[\s\/>])) не пашет вот это (?!(?:https?:\/\/|www\.)) а нижней регулярке, тоже самое работает
Проблема вот в чем ="(?!www) работать будет а ="?(?!www) - нет, потому что кавычка - не обязательная, т.е. ="www тут легко матчится как "после равно и пустого места (ибо "? вполне может быть пустым местом) не следует www (а оно и не следует - там кавычка следует) Должно работать такое: #<(?:a|link|img|script)[^>]+(?:href|src)(?:=("|')|=)(?!https?://|www\.).*?\1[^>]*>#is Кстати, а разве src=" - вокруг равно допустимы пробелы?
MiksIr погоди ка, ты на какую регулярку смотришь? ты на 1 смотри, вторая работает, там условие а в первой всё строго Код (Text): # (<(?:a|link|img|script) [^>]+ (?:href|src)\s*=\s*) # равно всегда есть и \s* (\'(?!(?:https?:\/\/|www\.))[^\']+\'| # смотрим нет ли бяки после одинарной кавычкой \"(?!(?:https?:\/\/|www\.))[^\"]+\"| # а этот после двойной (?!(?:https?:\/\/|www\.))[^\s]+ # а вот тут, по ЛОГИКЕ должно смотреть после равно или \s* (?=[\s\/>]))([^>]*\/?>) #isx рабочая Код (Text): #(<(?:a|link|img|script) [^>]+ (?:href|src)\s*=\s*) ((?(?=[\'\"]) (\'|\") (?!(?:https?:\/\/|www\.)).+? \\3 | (?!(?:https?:\/\/|www\.)) # вот тут же, тоже по логике смотрит после равно и \s* [^\s]+(?=[\s\/>]) )) ([^>]*\/?>)#isx это только кусок =)
Я не смотрел очень внимательно, если честно. Читать такие регулярки - мазохизм, проще с нуля по задаче написать =)
Лучше сделай регулярку для каждого тега в отдельности. И передай массив в preg_match_all. Разницы, вроде бы, не будет.
MiksIr задача найти все img/a/link/script в которых ссылки в src/href начинаются без http/www/ftp/# короче относительные ссылки НО регулярка нужна максимально универсальная так что по задаче, ты всё равно писать не будешь =) Kreker там замена идёт, не выборка а вообще, тут без разницы что для каждого тега, что по отдельности вся фигня в кавычках
Я вообще привел такую регулярку, только пробелы вокруг равно добавить и все. Кстати, а что <img src="www.domain.ru/gif"> - не относительная? Попробуйте в браузере.
Универсальность тебе будет стоить очень дорого: 1) Куча времени на написание нормальной регулярки 2) В дальнейшем сложное её редактирование (практически невозможно разобраться) 3) Ресурсоемкость Лучше разбить на несколько.
MiksIr твоя не учитывает что если кавычек нет, то конец ссылки первый пробел да ещё кое чё, вообщем, твоя не универсальная не, эта ссылка не относительная, она с доменом Kreker одна регулярка работает быстрее чем несколько(хотя смотря какая) свою регулярку, мне проблем не составляет редактирвоать даже если она записана в одну строку вообще я давно рабочую уже написал, тема то о том, почему же не работает проверка в первой регулярке
<img src=http://www.ya.ru> Где тут пробел? И потом - зачем тебе конец ссылки вообще? Она отвечает на поставленную задачу =) Идите, читайте дальше... rfc всякие =) И попробуйте, сначала, проверить, а потом утверждать.
MiksIr <img src=/blabla/bla2 style="width:1000px" aligh=left> зачем? мне достаточно того что мне такие ссылки не нужны в броузере они будут дёргаться по http + domain
Вообще, учитывая, что даже такая ссылка <img src="www.ya.ru/>aaa"> не валидная, то регексп можно еще более упростить #<(?:a|link|img|script)[^>]+(?:href|src)(?:=("|')|=)(?!https?://|www\.)[^>]*>#is тогда он матчит ваш пример нормально
MiksIr это валидное значение атрибута, а значит есть щанс его встретить короче, меня интересует почему не работает проверка в первой регулярке рабочую регулярку я и сам могу вполне написать, да уже написал...
Не, это не валидное значение http://www.ietf.org/rfc/rfc2396.txt (2.4.3) Иначе бы известная всем регулярка выкусывания тегов <[^>]+> шла бы лесом