Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Извлечение Url из Html на Php

256
14 марта 2006 года
foxweb
1.0K / / 27.07.2005
Извлечение URL из HTML на PHP.

Задача: как составить корректное регулярное выражение, а точнее даже небольшой скрипт, вытаскивающий из исходной HTML страницы URL адреса (в массив или файл) вида href="http://"

Требуется учесть наличие/отсутствие кавычек, символы @#%&? а также относительные и абсолютные URL.

Всё что находил в инете, на форумах - для частных случаев. Нужно универсальное решение. Думаю, многие скажут спасибо...
583
14 марта 2006 года
#define
150 / / 03.12.2002
 
Код:
$str = 'text
text site text
text <a hreg=ftp://test.ru/pa%20ge.html?p1=v1&p2=v2#25@user:pass>test</a> text
text <a href = /relative/url.html>url</a> text
text <a href=\\'
http://test.ru\\'>test</a> text';

preg_match_all('#href\s*=\s*("|\\')?(.*?)("|\\'|\s)#si',$str,$matches);
echo '<pre>';
print_r($matches);
echo '</pre>';

Примечания к коду: в тексте переменной $str в последней строке не прослешены одинарные кавычки в href'е - vBCode не позволил :( В регулярном выражении такая же фигня - не прослешены одинарные кавычки.

Массив $matches[0] будет содержать строки от href'а до закрывающей кавычки (или пробела), а $matches[2] чистые URL'ы. А 1 и 3 содержат открывающую и закрывающую кавычки, если они были.
338
14 марта 2006 года
chigevara
529 / / 29.09.2003
Ээээ...
А как же аттрибут src? Или имеются ввиду урлы от тэга a? но тогда в регекс попадет и <link href="x.css" rel="stylesheet" type="text/css">
Уточните вопрос пожалуйста...
Ps Одним регексом можно вряд ли, поскольку base придется учитывать при наличии.
583
14 марта 2006 года
#define
150 / / 03.12.2002
Тьфу... все бэкслеши пропали куда-то.. это наверное PHP-подстветка их убила.

Вот код:

$str = 'text
text site text
text url text
text <a href=\'http://test.ru\'>test</a> text';

preg_match_all('#href\s*=\s*("|\')?(.*?)("|\'|\s|>)#si',$str,$matches);

echo '<pre>';
print_r($matches);
echo '</pre>';
583
14 марта 2006 года
#define
150 / / 03.12.2002
Вряд ли нужны src.. а что до link href'ов, так всего ничего нужно вначале регэкспа 'a' поставить:
preg_match_all('#a\s+href.......

Если нужно еще и base учитывать, то его можно проверить 2ым регэкспом - вытащить содержимое. Потом в цикле (например при записи URL'ов в файл) можно подставить base, типа:

$fp = fopen($filename, 'a');

for($i=0;$i<count($matches);$i++) {
fputs($fp,$base.$matches[2][$i]);
}

fclose($fp);

Но это только относительных URL'ов качается, однако в цикле также можно проверить - если $matches[2][$i] относительный URL, то подставлять $base, иначе нет.

Мне вот интерестно для чего это надо?.. приходят нехорошие мысли - типа натаргетить скрипт на страницу, вытащить из нее УРЛы и мыла, а потом в цикле таргетить тот же скрипт по выковыриванию мыл на добытые УРЛы. Брр.. аж страшно :)
256
14 марта 2006 года
foxweb
1.0K / / 27.07.2005
Цитата:
Originally posted by chigevara
Ээээ...
А как же аттрибут src? Или имеются ввиду урлы от тэга a? но тогда в регекс попадет и <link href="x.css" rel="stylesheet" type="text/css">
Уточните вопрос пожалуйста...
Ps Одним регексом можно вряд ли, поскольку base придется учитывать при наличии.



Уточню задачу - нужно вытаскивать все ссылки, доступные пользователю при помощи мыши. То есть только вида "a href=". Остальные - не принципиально.

Вот отличный рабочий код, который удалось найти мне в PHP скачивальщике webcopier:

 
Код:
preg_match_all("!<a[^>]*\shref=[\"']?([^>\"'#\s]+)[\"']?[^>]*>!is",$str,$matches);
echo '<pre>';

foreach($matches[1] as $line)  echo $line."\n";
echo '</pre>';


Про BASE я тоже думал, но пока в относительные ссылки подставляем УРЛ текущей страницы.

2 #define:

Что то через раз ссылки достаёт... Иногда захватывает содержимое тэга A, иногда не полностью URLы.

Для чего это нужно? Спамом не занимаемся. Чисто поиск. Для своих некоммерческих проектов.

P.S. - Вроде слэши не пропали... Посмотрите
583
14 марта 2006 года
#define
150 / / 03.12.2002
Цитата:
Что то через раз ссылки достаёт... Иногда захватывает содержимое тэга A, иногда не полностью URLы.

Вы использовали регэксп с исправлеными слэшами? Такой?:
preg_match_all('#href\s*=\s*("|\')?(.*?)("|\'|\s|>)#si',$str,$matches);
Мои примеры он все нашел. Может конечно и недосмотрел чего - в этом случае привидите содержимое переменной $str - исправлю, если какие-то линки не достанет.

Цитата:
P.S. - Вроде слэши не пропали... Посмотрите

В приведенном вами регэкспе пропали слэши перед s, т.е. вместо \s стоит просто s.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог