我正在尝试获取网页上的所有链接。例如,如果用户在输入字段中键入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的链接等等。 我该怎么做呢我对正则表达式并不是很好,但我知道有一种方法可以使用它。
答案 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];
}
}