За последние 24 часа нас посетили 31762 программиста и 1359 роботов. Сейчас ищут 878 программистов ...

Как собрать все ссылки со страницы

Тема в разделе "PHP для новичков", создана пользователем Locker, 15 авг 2006.

  1. Locker

    Locker Активный пользователь

    С нами с:
    12 авг 2006
    Сообщения:
    124
    Симпатии:
    0
    Нужно проанализировать страницу на количество ссылок (SEO скрипт). Каким образом это сделать лучше и быстрее?
     
  2. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
  3. Locker

    Locker Активный пользователь

    С нами с:
    12 авг 2006
    Сообщения:
    124
    Симпатии:
    0
    Это я понял, но проблема след - а что если ссылка разбита на несколько строк? Хотя думаю можно файл в строку сделать и тогда парсить, но как это скажется на скорости?
     
  4. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Код (Text):
    1. preg_match_all('~<a[^>]+href=[^>]+>~sim', $source, $links);
    2. print_r($links);
     
  5. Locker

    Locker Активный пользователь

    С нами с:
    12 авг 2006
    Сообщения:
    124
    Симпатии:
    0
    Простите за глупый вопрос - а ~sim что означает?
     
  6. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    сокращение моего ника... :lol:
    мануал почитай, я же дал ссылки.
     
  7. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    +1
     
  8. Locker

    Locker Активный пользователь

    С нами с:
    12 авг 2006
    Сообщения:
    124
    Симпатии:
    0
    В общем примерно написал следующее
    Код (Text):
    1. preg_match_all('|<a(.*)href="(.*)>(.*)</a>|Uis', $text, $out);
    Но проблема такая возникла - если ссылка имеет вид <a href="host">text</a>, то все нормально, но если <a href="host" class="class">text</a>, то вместо имя хоста он берет host" class="class. Возможно это как то решить?
     
  9. svk

    svk Активный пользователь

    С нами с:
    7 авг 2006
    Сообщения:
    506
    Симпатии:
    0
    Адрес:
    NetByNet
    preg_match_all('|<a(.*)href="(.*)"(.*)>(.*)</a>|Uis', $text, $out);
     
  10. Mavir

    Mavir Guest

    preg_match_all('|<a.*href="(.*)".*>(.*)</a>|Uis', $text, $out);
     
  11. Locker

    Locker Активный пользователь

    С нами с:
    12 авг 2006
    Сообщения:
    124
    Симпатии:
    0
    Спасибо. Оба примера подошли.
     
  12. Mavir

    Mavir Guest

    Мой более правильный. В варианте svk в $out заносятся лишние значения - все что находится между <a и href, кавычкой и >.

    Чтобы посмотреть, что находится выведи print_r($out);
     
  13. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    а как насчет варианта, когда кавычки в тэге одинарные или когда их вообще нет?
    PHP:
    1. <?php
    2. $str = '<a href=http://link1 class="test">link1</a>
    3. <a style="" href=\'http://link2\'>link2</a>
    4. <a href="http://link3">link3</a>
    5. <a href=http://link4>link4</a>';
    6. preg_match_all('~<a.*?href=(\'|"|)([^\s]+)\\1[^>]*?>(.*?)</a>~is', $str, $out);
    7. print_r($out);
    8. ?>
     
  14. Locker

    Locker Активный пользователь

    С нами с:
    12 авг 2006
    Сообщения:
    124
    Симпатии:
    0
    Ну все. Симпсон всех победил :)
     
  15. Vah

    Vah Активный пользователь

    С нами с:
    15 май 2006
    Сообщения:
    228
    Симпатии:
    0
    дайте напильник - и мы сделаем вертолет... (ц) какой-то топик здесь.... =)

    щяс домой доберусь..... и выдам кусок кода..... =)
     
  16. Locker

    Locker Активный пользователь

    С нами с:
    12 авг 2006
    Сообщения:
    124
    Симпатии:
    0
    Видимо не добрался :-D
     
  17. cia

    cia Активный пользователь

    С нами с:
    18 авг 2006
    Сообщения:
    17
    Симпатии:
    0
    Если еще надо...
    Просто сам недавно парился со сбором ссылок и вот что получилось. Это проверяет все <a href=... , а также <img src=... , т.е. и рисунки тоже.

    preg_match_all('/<(?:[aA][\s]+[hH][rR][eE][fF]|[iI][mM][gG][\s]+.*[\s]+[sS][rR][cC])[\s]*=[\s]*[\'"]([^\s">]+)[\'"]/',$info,$res);

    И не говори, что получилось длиновато. Это работает быстро, тем более что у меня вопрос о скорости не стоял
     
  18. Mavir

    Mavir Guest

  19. Anonymous

    Anonymous Guest

    Из мануала:
    - сократит ваш шаблон втрое.
     
  20. Mavir

    Mavir Guest

    Кстати, есть неточность.
    Эта регулярка не выловит ссылку, например, такого вида <a class="link" href="index.php">
     
  21. Anonymous

    Anonymous Guest

    кстати, да - а помоему, зачем вообще плясать от тега? точнее, надо плясать от "<a" до "href=" и все....а между ними пусть .+ будет...
     
  22. cia

    cia Активный пользователь

    С нами с:
    18 авг 2006
    Сообщения:
    17
    Симпатии:
    0
    Да знаю. Просто искал готовую регулярку, которая возвращала бы также и ссылки с картинок... не нашел, поэтому написал сам, попутно изучив азы регулярных выражений. Того что есть мне вполне достаточно.

    Большое количество модификаторов лишь сокращают запись, однако производительность не повышают (хочется подтвердить свои слова словами других, но, увы, не нашел того, где я это вычитал).

    Да, действительно, баг. Уже месяц эта регулярка работает, однако подобной конструкции не выявлено... странно.
     
  23. Anonymous

    Anonymous Guest

    И как она должна выявится?
    Она просто пролетает мимо условия...
     
  24. cia

    cia Активный пользователь

    С нами с:
    18 авг 2006
    Сообщения:
    17
    Симпатии:
    0
    Я имел в виду, что никто не жаловался.
     
  25. Anonymous

    Anonymous Guest

    Крайне любопытный метод отлова ошибок...