【问题标题】:all links on a page, and how many of these link to the same page again (how can we do that in php)?一个页面上的所有链接,其中有多少链接再次指向同一页面(我们如何在 php 中做到这一点)?
【发布时间】:2011-01-09 14:56:37
【问题描述】:

我正在尝试编写一个小的 PHP 函数,该函数将通过一个页面(提供一个 url)并返回链接数和链接到同一页面的链接数。例如,如果我提供 google.com 作为 URL,它应该返回 google.com 上有多少链接以及有多少链接返回 google.com(当然包括 www.google.com、google.com、google.com)。 com/# 等)

这很容易做到吗?我该怎么做?

(这不是家庭作业问题,因此请提供尽可能多的帮助

如果您需要更多关于我的意思的信息,请让我提供更多信息

【问题讨论】:

    标签: php


    【解决方案1】:

    我建议SimpleXml 或DOM 完成这项任务,但他们会因无效标记而窒息,不幸的是,大多数网络仍在使用无效标记,including Google 你在问题中提到。您可以从这些 URL 和 tidy 获取 HTML,但您也可以使用 SimpleHTML

    $links = array('inbound' => array(),
                   'outbound' => array());
    
    $url  = 'http://www.example.com';
    $host = parse_url($url, PHP_URL_HOST);    
    $html = file_get_html($url);
    foreach($html->findElementsByTagName('a') as $link) {
        $linkHost = parse_url($link->href, PHP_URL_HOST);
        $type     = ($linkHost === $host) ? 'inbound' : 'outbound';
        $links[$type][] = $link->href;
    }
    
    print_r($links);
    

    请注意,我没有安装 SimpleHTML 的 atm,因此上述方法可能无法直接使用。不过,它应该会为您指明正确的方向。


    编辑

    天哪,我真的写了这个吗?我是喝醉了还是怎么了?为什么没有人抱怨呢?纠正自己:

    如果您使用loadHTML() 方法,DOM 可以很好地处理损坏的 HTML。 SimpleXml 没有。建议的 SimpleHtmlDom 解决方案可能会起作用,但 IMO SimpleHTMLDom 很糟糕。更好的第三方库可以在Best Methods to parse HTML找到。

    【讨论】:

    • 我确实安装了简单的 html,并实现了代码,但它仍然无法正常工作,有什么原因会发生这种情况吗?
    • 好吧,就像我在代码下面所说的那样,它可能无法开箱即用,但如果你不告诉我什么,我将无法提供帮助完全不工作。它是否显示任何错误?你改变了 $url 吗?它是否找到任何链接? $links 中会有链接吗?更多细节请:)
    【解决方案2】:

    将页面内容加载到变量中:

    $html = file_get_contents("http://www.somesite.com"); 
    

    并在 $html 上执行 preg_match()

    查看那个的 php 手册。

    http://www.php.net/manual/en/function.preg-match.php

    【讨论】:

    • 虽然这可行,但 Regex 不是解析 HTML 的正确工具。正则表达式用于字符串模式匹配,而不是 DOM 遍历。
    【解决方案3】:

    http://php.net/manual/en/book.simplexml.php

    您可以使用 simpleXML 查找页面中的所有链接,然后使用 preg_match 解析生成的链接以查看它们是否与您正在搜索的内容匹配。

    【讨论】:

    • 不适用于无效的 HTML。您必须在 SimpleXML 之前使用 Tidy,或者改用 SimpleHTML。
    • 他没有提到无效的HTML =x 但是我之前没有使用过SimpleHTML,也许我应该检查一下:)
    • 他提到了谷歌。这等于无效的 HTML ;)
    【解决方案4】:

    我会说正则表达式和哈希的组合。我的 PhP 很烂,但在 Perl 中会是这样的

    my %Counter;
    while(my currentLine = <inData>){
    if($currentLine = /(www\..+\.+\/)/){
      $Counter{$1}++;
    }
    }
    
    foreach $thingy (keys %Counter){
     print "There are $Counter{$thingy} links to $thingy in this document\n";
    }
    

    【讨论】:

    • 如果页面中有纯文本 URL?他想要链接。您不使用正则表达式解析 HTML。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2010-11-18
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    相关资源
    最近更新 更多