我使用XPath
来解析HTML网页以获取所有内部链接。 DOMXPath
将返回href
中提供的所有链接。如何将内部链接分开?
我引入了一系列字符串检查来删除外部链接;但问题是有不同的方法来链接内部页面,如
page.html
/page.html
http://domain.com/page.html
http://subdomain.domain.com/page.html
....
区分内部链接(包含其子域的当前域的任何链接)和外部链接(到任何其他域)的最安全的方法是什么。
答案 0 :(得分:2)
这是我用preg_match编写的一个小例子。如果有帮助,请告诉我。
<?php
function get_a_href($url){
$url = htmlentities(strip_tags($url));
$ExplodeUrlInArray = explode('/',$url);
$DomainName = $ExplodeUrlInArray[2];
$file = @file_get_contents($url);
$h1count = preg_match_all('/(href=["|\'])(.*?)(["|\'])/i',$file,$patterns);
$linksInArray = $patterns[2];
$CountOfLinks = count($linksInArray);
$InternalLinkCount = 0;
$ExternalLinkCount = 0;
for($Counter=0;$Counter<$CountOfLinks;$Counter++){
if($linksInArray[$Counter] == "" || $linksInArray[$Counter] == "#")
continue;
preg_match('/javascript:/', $linksInArray[$Counter],$CheckJavascriptLink);
if($CheckJavascriptLink != NULL)
continue;
$Link = $linksInArray[$Counter];
preg_match('/\?/', $linksInArray[$Counter],$CheckForArgumentsInUrl);
if($CheckForArgumentsInUrl != NULL)
{
$ExplodeLink = explode('?',$linksInArray[$Counter]);
$Link = $ExplodeLink[0];
}
preg_match('/'.$DomainName.'/',$Link,$Check);
if($Check == NULL)
{
preg_match('/http:\/\//',$Link,$ExternalLinkCheck);
if($ExternalLinkCheck == NULL)
{
$InternalDomainsInArray[$InternalLinkCount] = $Link;
$InternalLinkCount++;
}
else
{
$ExternalDomainsInArray[$ExternalLinkCount] = $Link;
$ExternalLinkCount++;
}
}
else
{
$InternalDomainsInArray[$InternalLinkCount] = $Link;
$InternalLinkCount++;
}
}
$LinksResultsInArray = array(
'ExternalLinks'=>$ExternalDomainsInArray,
'InternalLinks'=>$InternalDomainsInArray
);
return $LinksResultsInArray;
}
?>
答案 1 :(得分:0)
使用substr()查看前4个字符是否为http。
如果是,请使用parse_url()功能检查主机是否相同。 如果没有,那就是内部的。