Вытащить все внешние ссылки с сайта

Статус
В этой теме нельзя размещать новые ответы.
Denis5
Код:
(?xi)
<a\b(?>\s*\b[a-z]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^<>'"\s]+)))*
\s*\bhref\s*=\s*(?|
"(?!https?://(?:www\.)?somesite\.ru)([^"]*)"|
'(?!https?://(?:www\.)?somesite\.ru)([^']*)'|
(?!https?://(?:www\.)?somesite\.ru)([^<>'"\s]+)
)
Metaller
Много ошибок...
 
RolCom, напиши плиз полностью, у меня не получается.

PHP:
$host = "yandex.ru";
$host = str_replace('.', '\.', $host); 
$regex = '(?xi)
<a\b(?>\s*\b[a-z]+(?:\s*=\s*(?:"[^"]*"|\'[^\']*\'|[^<>\'"\s]+)))*
\s*\bhref\s*=\s*(?|
"(?!https?://(?:www\.)?'.$host.')([^"]*)"|
\'(?!https?://(?:www\.)?'.$host.')([^\']*)\'|
(?!https?://(?:www\.)?'.$host.')([^<>\'"\s]+)
)';

preg_match_all($regex, $data, $array);  

print_r($array);
 
Забыл символы-ограничители
PHP:
<?php
$host = "yandex.ru";
$host = preg_quote($host,'%'); 
$regex = '%
<a\b(?>\s*\b[a-z]+(?:\s*=\s*(?:"[^"]*"|\'[^\']*\'|[^<>\'"\s]+)))*
\s*\bhref\s*=\s*(?|
"(?!https?://(?:www\.)?'.$host.')([^"]*)"|
\'(?!https?://(?:www\.)?'.$host.')([^\']*)\'|
(?!https?://(?:www\.)?'.$host.')([^<>\'"\s]+)
)%xi';
 
А как к тому, что выше ещё добавить не брать
href=""
href="/"
href="/blablabla"
href="#"
href="#blablabla"
 
Denis5
На мой взгляд, лучше сделать двумя регулярками попроще, чем одной большой. Как правило этот варинат производительнее.

Я предлагаю, сначала вытянуть все ссылки в массив, а потом пройтись по нему твоими ограничивающими условиями и повыкидывать элементы массива. Т.к. эти проверки уже можно будет делать не регуляркой, а простыми быстрыми функциями поиска подстроки.
 
Denis5, держи
Код:
<a\b(?>\s*\b[a-z]+(?:\s*=\s*(?:"[^"]*"|'[^\']*'|[^<>\'"\s]+)))*
\s*\bhref\s*=\s*(?|
"(?!https?://(?:www\.)?site\.ru)([a-z]+://[^"]*)"|
'(?!https?://(?:www\.)?site\.ru)([a-z]+://[^\']*)'|
(?!https?://(?:www\.)?site\.ru)([a-z]+://[^<>\'"\s]+)
)


Denis5
На мой взгляд, лучше сделать двумя регулярками попроще, чем одной большой. Как правило этот варинат производительнее.
Я предлагаю, сначала вытянуть все ссылки в массив, а потом пройтись по нему твоими ограничивающими условиями и повыкидывать элементы массива. Т.к. эти проверки уже можно будет делать не регуляркой, а простыми быстрыми функциями поиска подстроки.

Наоборот, как чаще одной регуляркой производительней, в т.ч. и в этом случае.
 
спасибо.......
 
Если ссылки, например, на внутренние страницы сайта, имеющие собственные значения, можно воспользоваться примерно таким кодом:

PHP:
$result = file_get_contents('http://intv.ru');
preg_match_all('#<a href="/view/(.)film(.)id=[0-9]*"><span class="title">(.*?)</span>#si', $result, $out);

for ($i=0; $i < count($out[0]); $i++) {
  echo $out[0][$i] . "<br>";
}

Сделала на примере сайта INTV. Скрипт выводит, как видно по коду, все заголовки видео. При большом желании можно править в пользу получения доп. информации. Например, для вывода обложки фильма.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху