Помогите с регуляркой

  • Автор темы Автор темы Den1xxx
  • Дата начала Дата начала

Den1xxx

Разрушитель (V)
Сообщения
135
Реакции
71
Баллы
1 084
Здравствуйте.
Нужно в целевой странице заменить все вхождения ссылок.
То есть ищем где href="link" и вытягиваем link, вроде просто всё
Однако регулярка почему-то видит только ссылки без протокола и внутренние:
PHP:
$result = preg_replace_callback('#(href|src)=["\']([^:]*)["\']#Ui', 'fm_url_proxy', $result);
А начинающиеся с «https://» не берёт.
Мне интересно, почему. И как переделать?
 
Может просто ссылку брать http/s
Извиняюсь что слешь не в ту сторону
 
Хех, дело в другом было оказывается
За href перед и после равно могут быть пробелы, а также ограничения ссылки могут быть не двойными, а одинарными скобками.
В общем пока не дописал, но кое-что получается уже)
UPD получилось в 2 этапа:
PHP:
        $result = preg_replace_callback('#(href|src)[\s]?=[\s]?"([^"]+)"#', 'fm_url_proxy', $result);
        $result = preg_replace_callback("#(href|src)[\s]?=[\s]?'([^']+)'#", 'fm_url_proxy', $result);
Наверное можно было и в 1 этап, но тогда неоднозначны пары стартующих/завершающих скобок.
Так что получился немного говнокод, что в общем-то обычное дело для PHP=)
 
Последнее редактирование:
Можно в 1 этап.
PHP:
$result = preg_replace_callback('#(href|src)\s?=\s?(?|"([^"]+)"|\'([^\']+)\')#', 'fm_url_proxy', $result);
 
Я когда-то тоже долго мучал похожую задачу, скомбинировал вот такую махину.
Находим ссылки в тегах и в тексте и заменяем на свою через редирект.
PHP:
$result = preg_replace("#((?<!\"|\">|=)((https?:\/\/)|((?<!\/)www\.))(.*?[a-z_\/0-9\-\#=&]))(?=(\.|,|\)|<|;|\?|\!)?(\"|'|«|»|\)|<|\[|\s|\r|\n|$))#iS", 
"<a rel=\"nofollow\" target=\"_blank\" href=\"{$site_http}index.php?action=link&url=http://\$4\$5\">\$4\$5</a>", 
$text);
 
Я когда-то тоже долго мучал похожую задачу, скомбинировал вот такую махину.
Находим ссылки в тегах и в тексте и заменяем на свою через редирект.
PHP:
$result = preg_replace("#((?<!\"|\">|=)((https?:\/\/)|((?<!\/)www\.))(.*?[a-z_\/0-9\-\#=&]))(?=(\.|,|\)|<|;|\?|\!)?(\"|'|«|»|\)|<|\[|\s|\r|\n|$))#iS",
"<a rel=\"nofollow\" target=\"_blank\" href=\"{$site_http}index.php?action=link&url=http://\$4\$5\">\$4\$5</a>",
$text);
Неправильно так делать: ссылки могут иметь классы, id и пр. — потеряешь стили, js события и прочий функционал.
 
Ссылки выбираются из сырого текста. Под мои задачи подходит.
 
Подскажите, а как путей xpath обход на php делать? Есть где то статьи?
 
Назад
Верх