利用PHP獲取一個頁面上的連結資訊
開發中我們可能會獲取某個頁面或是一段內容中的連結資訊,下面我分享一個我寫的函式給大家,希望能幫到大家。
函式功能:
1、獲取一段內容中連結資訊;
2、獲取一個URL中連結資訊;
3、剔除錨鏈等無效的連結
4、獲取當前域下的連結資訊
5、獲取他域下的連結資訊
6、保留連結的文字資訊
程式碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
/** * +----------------------------------------------------------
* 功能:獲取一個網頁或一段內容裡面的連結資訊
* +----------------------------------------------------------
* @param string $html 要獲取連結的內容或網址
* @param string $isExclude 是否過濾無效的連結,如"","#","javascript:;","javascript:void(0);" 。預設過濾
* @param string $isKeepLinkText 是否保留連結的文字。預設保留,保留與不保留連結數可能不同
* @param string $linkType 取得連結的型別,all所有的連結,inner 本域下的連結, out 外域的連結資訊。預設 是取得所有連結
* +----------------------------------------------------------
* @return array
* +----------------------------------------------------------
*/
function getLinks( $html , $isExclude =true, $isKeepLinkText =true, $linkType = `all` ){
if ( empty ( $html )) return false;
set_time_limit(0); //防止超時
$removes = array ( `` , `#` , `javascript:;` , `javascript:void(0);` , `javascript:void(0)` ); //排除錨鏈之類的
$html = substr ( strtolower ( $html ),0,4)== "http" ? file_get_contents ( $html ): $html ; //要處理的內容
//提取連結資訊
$pattern = `/<a(?:.*?)href="(((?:http(?:s?)://)?([^"/]+))?(?:[^"]*))"(?:[^>]*?)>([^<]*?)</a>/i` ;
preg_match_all( $pattern , $html , $_links );
if ( $isKeepLinkText ){
foreach ( $_links [1] as $key => $href ) {
$links [ $_links [4][ $key ]]= $href ;
}
} else {
$links = $_links [4];
}
unset( $_links );
foreach ( $links as $text => $href ) {
//移除無效的連結
if ( $isExclude &&in_array( $href , $removes )) {
unset( $links [ $text ]);
}
if ( $linkType != `all` ){
$host = parse_url ( $href );
$host =isset( $host [ `host` ])? $host [ `host` ]: `` ;
if ( $linkType == `inner` ){ //本域連結
if ( substr ( $href ,0,1)!= "/" && strtolower ( $host )!= strtolower ( $_SERVER [ `SERVER_NAME` ])) {
unset( $links [ $text ]);
}
} elseif ( $linkType == `out` ){ //他域連結
if ( substr ( $href ,0,1)== "/" || strtolower ( $host )== strtolower ( $_SERVER [ `SERVER_NAME` ])) {
unset( $links [ $text ]);
}
}
}
}
return $links ;
} |
使用方法:
1
2
3
4
5
6
7
|
$links =getLinks( "http://www.sina.com.cn" );
//或 $links =getLinks( "http://www.sina.com.cn" ,1,0, "out" );
//或
$links =getLinks( "這裡是一段要提取連結資訊的內容" );
|
特別說明:
1、上面的函式用到了file_get_contents ,獲取內容可能會失敗,你可以自行改成curl;
2、提取連結用了正則,效率可能低。
當然你也看一看使用下面的函式,當要提取的內容網址的時候不使用正則來提取連結資訊:
程式碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
/** * +----------------------------------------------------------
* 功能:獲取一個網頁或一段內容裡面的連結資訊
* +----------------------------------------------------------
* @param string $html 要獲取連結的內容或網址
* @param string $isExclude 是否過濾無效的連結,如"","#","javascript:;","javascript:void(0);" 。預設過濾
* @param string $isKeepLinkText 是否保留連結的文字。預設保留,保留與不保留連結數可能不同
* @param string $linkType 取得連結的型別,all所有的連結,inner 本域下的連結, out 外域的連結資訊。預設 是取得所有連結
* +----------------------------------------------------------
* @return array
* +----------------------------------------------------------
*/
function getLinks( $html , $isExclude =true, $isKeepLinkText =true, $linkType = `all` ){
if ( empty ( $html )) return false;
set_time_limit(0);
$removes = array ( `` , `#` , `javascript:;` , `javascript:void(0);` , `javascript:void(0)` ); //排除錨鏈之類的
$isLink = substr ( strtolower ( $html ),0,4)== "http" ?1:0; //是否是連結
$html = $isLink ? file_get_contents ( $html ): $html ;
if ( $isLink ){
$dom = new DOMDocument();
@ $dom ->loadHTML( $html );
$xpath = new DOMXPath( $dom );
unset( $dom );
$hrefs = $xpath ->evaluate( "/html/body//a" );//獲取a節點
$length = $hrefs ->length; //獲取連結數
$links = array (); //網頁上的連結
for ( $i = 0; $i < $length ; $i ++) {
$href = trim( $hrefs ->item( $i )->getAttribute( `href` ));
$text =trim( $hrefs ->item( $i )->textContent);
$links [ $text ]= $href ;
}
} else {
$pattern = `/<a(?:.*?)href="(((?:http(?:s?)://)?([^"/]+))?(?:[^"]*))"(?:[^>]*?)>([^<]*?)</a>/i` ;
preg_match_all( $pattern , $html , $_links );
if ( $isKeepLinkText ){
foreach ( $_links [2] as $key => $href ) {
$links [ $_links [4][ $key ]]= $href ;
}
} else {
$links = $_links [4];
}
unset( $_links );
}
foreach ( $links as $text => $href ) {
//移除無效的連結
if ( $isExclude &&in_array( $href , $removes )) {
unset( $links [ $text ]);
}
if ( $linkType != `all` ){
$host = parse_url ( $href );
$host =isset( $host [ `host` ])? $host [ `host` ]: `` ;
if ( $linkType == `inner` ){ //本域連結
if ( substr ( $href ,0,1)!= "/" && strtolower ( $host )!= strtolower ( $_SERVER [ `SERVER_NAME` ])) {
unset( $links [ $text ]);
}
} elseif ( $linkType == `out` ){ //他域連結
if ( substr ( $href ,0,1)== "/" || strtolower ( $host )== strtolower ( $_SERVER [ `SERVER_NAME` ])) {
unset( $links [ $text ]);
}
}
}
}
return $links ;
} |
使用方法與上面一致
本文轉自 gutaotao1989 51CTO部落格,原文連結:http://blog.51cto.com/taoyouth/1410393
相關文章
- 利用node.js獲取頁面中的所有超連結<a>Node.js
- 用JavaScript獲取頁面上被選中的文字的技巧JavaScript
- PHP獲取動態跳轉後的真實連結PHP
- python四種方式解析網頁獲取頁面中的連結Python網頁
- PHP獲取客戶端、PHP獲取伺服器相關資訊PHP客戶端伺服器
- 獲取連結上的引數,返回一個Object物件 - 戴向天Object物件
- 詳情API介面上貨搬運獲取資訊API介面API
- 獲取當前頁面的上一個頁地址
- 探究 | 如何捕獲一個Activity頁面上所有的點選行為
- 從 app 開啟一個連結 www.baidu.com,如何獲取該連結的 url?APPAI
- product.get( 獲取一個產品的資訊 )
- php-MediaInfo 獲取媒體資訊PHPAI
- 如何在一個頁面上讓多個jQueryjQuery
- 使用PHP獲取影像檔案的EXIF資訊PHP
- PHP獲取陣列最後一個值PHP陣列
- PHP PDO獲取結果集PHP
- php獲取網頁內容的三種方法PHP網頁
- 利用VC++獲取異構型資料庫庫結構資訊 (轉)C++資料庫
- 如何在一個頁面上讓多個jQuery版本共存jQuery
- WKWebView 獲取網頁高度,圖片點選檢視,網頁連結點選WebView網頁
- 利用WinAPI(GetFileVersionInfo)獲取檔案版本資訊API
- php一句話獲取獲取檔案目錄的方法PHP
- 利用requests+BeautifulSoup爬取網頁關鍵資訊網頁
- 利用js獲取當前頁面的域名程式碼JS
- 利用XMLHTTP 從其他頁面獲取資料 (轉)XMLHTTP
- PHP中獲取當前頁面的完整URLPHP
- PHP獲取當前頁面完整URL地址PHP
- 解決多個路由繫結同一個元件 獲取引數只獲取一次的方法路由元件
- java獲取前端頁面傳送的cookie中的資訊Java前端Cookie
- java 獲取URL連結 內容Java
- js獲取url連結中的引數JS
- iOS 獲取當前已連線 WiFi 資訊iOSWiFi
- java獲取全國到深圳一個月的機票價格資訊Java
- php獲取並刪除陣列的第一個和最後一個元素PHP陣列
- 遮罩層遮不住DropDownList---獲取頁面上所有的select並隱藏遮罩
- PHP獲取上級(來路)URL相關資訊PHP
- 爬蟲例項-淘寶頁面商品資訊獲取爬蟲
- c#利用WebClient和WebRequest獲取網頁原始碼C#Webclient網頁原始碼