Извлечение Url из Html на Php
Задача: как составить корректное регулярное выражение, а точнее даже небольшой скрипт, вытаскивающий из исходной HTML страницы URL адреса (в массив или файл) вида href="http://"
Требуется учесть наличие/отсутствие кавычек, символы @#%&? а также относительные и абсолютные URL.
Всё что находил в инете, на форумах - для частных случаев. Нужно универсальное решение. Думаю, многие скажут спасибо...
Код:
$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>';
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 содержат открывающую и закрывающую кавычки, если они были.
А как же аттрибут src? Или имеются ввиду урлы от тэга a? но тогда в регекс попадет и <link href="x.css" rel="stylesheet" type="text/css">
Уточните вопрос пожалуйста...
Ps Одним регексом можно вряд ли, поскольку base придется учитывать при наличии.
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, иначе нет.
Мне вот интерестно для чего это надо?.. приходят нехорошие мысли - типа натаргетить скрипт на страницу, вытащить из нее УРЛы и мыла, а потом в цикле таргетить тот же скрипт по выковыриванию мыл на добытые УРЛы. Брр.. аж страшно :)
Цитата:
Originally posted by chigevara
Ээээ...
А как же аттрибут src? Или имеются ввиду урлы от тэга a? но тогда в регекс попадет и <link href="x.css" rel="stylesheet" type="text/css">
Уточните вопрос пожалуйста...
Ps Одним регексом можно вряд ли, поскольку base придется учитывать при наличии.
Ээээ...
А как же аттрибут 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>';
echo '<pre>';
foreach($matches[1] as $line) echo $line."\n";
echo '</pre>';
Про BASE я тоже думал, но пока в относительные ссылки подставляем УРЛ текущей страницы.
2 #define:
Что то через раз ссылки достаёт... Иногда захватывает содержимое тэга A, иногда не полностью URLы.
Для чего это нужно? Спамом не занимаемся. Чисто поиск. Для своих некоммерческих проектов.
P.S. - Вроде слэши не пропали... Посмотрите
Цитата:
Что то через раз ссылки достаёт... Иногда захватывает содержимое тэга A, иногда не полностью URLы.
Вы использовали регэксп с исправлеными слэшами? Такой?:
preg_match_all('#href\s*=\s*("|\')?(.*?)("|\'|\s|>)#si',$str,$matches);
Мои примеры он все нашел. Может конечно и недосмотрел чего - в этом случае привидите содержимое переменной $str - исправлю, если какие-то линки не достанет.
Цитата:
P.S. - Вроде слэши не пропали... Посмотрите
В приведенном вами регэкспе пропали слэши перед s, т.е. вместо \s стоит просто s.