如何获取以https链接开头的页面上的所有链接 - PHP

时间:2017-06-07 13:40:49

标签: php regex laravel url-rewriting

我正在尝试获取网页上的所有链接。例如,如果用户在输入字段中键入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

这就是我得到的:

Page Links

问题是,我只想获得以 https 开头的所有链接。我想避免在其中包含/ doc的链接等等。 我该怎么做呢我对正则表达式并不是很好,但我知道有一种方法可以使用它。

4 个答案:

答案 0 :(得分:2)

$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'));

答案 1 :(得分:1)

如何使用parse_url()检查协议?

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

答案 2 :(得分:0)

为什么不检查String是否以HTTPS开头,然后才将其推入阵列?例如:

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

答案 3 :(得分:0)

^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];
    }
}