【问题标题】:How to get all links on a page that start with a https in link - PHP如何获取页面上以 https 开头的所有链接 - PHP
【发布时间】:2017-06-07 13:40:48
【问题描述】:

我正在尝试获取页面上的所有链接。例如,如果用户在输入字段中输入https://laravel.com/,他们将看到该页面上的所有链接。

我已经让这个概念起作用了。这是我的部分代码:

$website = request('website_url');

$pureURL = 'http://www.'.$website.'/';
$doc = new \DOMDocument;
@$doc->loadHTMLFile($pureURL);

foreach ($doc->getElementsByTagName('a') as $link){
    $linkDetail[] = array('url' => $link->getAttribute('href'));
}

$pageLinks = $linkDetail;

return view('api.index', compact('result'));

我的前端代码:

@foreach($pageLinks as $key => $link)
        {{ $link['url'] }}<br />
@endforeach

这是我得到的:

问题是,我只想获取所有以 https 开头的链接。我想避免其中有 /doc 的链接等等。 我将如何去做。我不太擅长正则表达式,但我知道有一种方法可以使用它。

【问题讨论】:

  • 你可以使用strpos函数来检查href是否包含https。像这样if (strpos($link-&gt;getAttribute('href'), 'https') !== false) {
  • 使用 parse_url 看这里stackoverflow.com/questions/7468309/…

标签: php regex laravel url-rewriting


【解决方案1】:
$website = request('website_url');

$pureURL = 'http://www.'.$website.'/';
$doc = new \DOMDocument;
@$doc->loadHTMLFile($pureURL);

foreach ($doc->getElementsByTagName('a') as $link){
$url = $link->getAttribute('href');
    if (strpos($url, 'https') !== 0) {
        continue;
    }
    $linkDetail[] = array('url' => $url);
}

$pageLinks = $linkDetail;

return view('api.index', compact('result'));

【讨论】:

    【解决方案2】:

    parse_url()检查协议怎么样?

    foreach ($doc->getElementsByTagName('a') as $link){
        if (parse_url($link->getAttribute('href'), PHP_URL_SCHEME) === 'https') {
            $linkDetail[] = array('url' => $link->getAttribute('href'));
        }
    }
    

    【讨论】:

    • 是的,这正是我想要的。谢谢!
    【解决方案3】:

    为什么不检查字符串是否以 HTTPS 开头,然后才将其推送到数组中?例如:

    foreach ($doc->getElementsByTagName('a') as $link){
       if (strpos($link, 'https://') !== FALSE)
          $linkDetail[] = array('url' => $link->getAttribute('href'));
    }
    

    【讨论】:

      【解决方案4】:
      ^https.*[^doc|avoid_end]$
      

      类似https://regex101.com/r/I4ebAR/1

      foreach ($doc->getElementsByTagName('a') as $link){
          $linkTmp = $link->getAttribute('href');
          if (preg_match('/^https.*[^doc|avoid_end]$/')) {
              $linkDetail[] = ['url' => $linkTmp];
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-01-21
        • 2011-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-17
        • 2019-02-27
        相关资源
        最近更新 更多