Xpoint
   [напомнить пароль]

Подмена ссылок на странице

Метки: [без меток]
[удл]
2004-05-19 02:47:19 [обр] XpyDi[досье]
Пытаюсь исправить все относительные ссылки <link REL="STYLESHEET" href="Body.css"> на <link REL="STYLESHEET" href="go.pl?Body.css">, при этом не трогая ссылки на html файлы(там идет другая подмена). Подмена производится во всех тегах ссылающихся на другие файлы.
Использую вот такой вот код:
$tag =~ s/(href|scr)\=(\'?\"?)(?!http:\/\/)(.+(?!\.html?))(\'?\"?)/$1=$2go.pl\?$3$4/gi;
но он раньше работал, а потом я в нём что-то исправил и он перестал работать, что я изменил ума не приложу вроде и так правильно, но не работает почему-то.
спустя 9 часов [обр] polk(19/185)[досье]
Хм... Странно - у меня работает:
my $tag = qq(<link REL="STYLESHEET" href="Body.css">);
$tag =~ s~(href|scr)=(['"]?)(?!http://)([^\2]+(?!\.html?))\2?~$1=$2go.pl?$3~gi;
спустя 1 день 9 часов [обр] XpyDi[досье]
Да проблема в том, что если вместо Body.css поставить Body.htm иили Body.html, то он все равно его заменяет, а не должен.
спустя 3 дня [обр] Закиров Руслан(12/343)[досье]

Остановился на

s#(href|src)=(['"]?)(?!http://)((?(2)[^'"]+|.+))(?<!\.html)(?(2)['"]|\s)#$1=$2go.pl?$3#gi;

не отрабатывает нормально .htm
В вашем запросе неправильно несколько моментов:

  1. [^\2] эквивалентно [\1\3-\32767], а не ссылке на значение второй захваченой переменной.
  2. если просто поменять на (?(2)[^'"]+|\S+) то это все равно не решает задачу, потому что последующее условие(?!\.html?) будет почти всегда находить совпадение.
  3. Надо смотреть назад от разделителя, а заглядывать назад назад можно только фиксированой длинной, соответственно что-то теряем.
  4. опять же все ломается, если в вызове есть параметры: ttt.html?qwerty=2

Напрашивается совершенно логичный вывод: надо использовать какой-нибудь парсер HTML.

Powered by POEM™ Engine Copyright © 2002-2005