利用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
相關文章
- R:連結KEGG資料庫獲取更多描述資訊資料庫
- python四種方式解析網頁獲取頁面中的連結Python網頁
- PHP獲取動態跳轉後的真實連結PHP
- Lavarel Ajax 分頁時 獲取分頁資訊
- php-MediaInfo 獲取媒體資訊PHPAI
- 詳情API介面上貨搬運獲取資訊API介面API
- 使用PHP獲取影像檔案的EXIF資訊PHP
- 從 app 開啟一個連結 www.baidu.com,如何獲取該連結的 url?APPAI
- product.get( 獲取一個產品的資訊 )
- 獲取連結上的引數,返回一個Object物件 - 戴向天Object物件
- 探究 | 如何捕獲一個Activity頁面上所有的點選行為
- 易優CMS根據aid獲取文件頁面連結AI
- PHP獲取陣列最後一個值PHP陣列
- php獲取網頁內容的三種方法PHP網頁
- 寫一個獲取頁面中所有checkbox的方法
- 利用requests+BeautifulSoup爬取網頁關鍵資訊網頁
- Selenium 獲取複製後的連結
- java獲取前端頁面傳送的cookie中的資訊Java前端Cookie
- WKWebView 獲取網頁高度,圖片點選檢視,網頁連結點選WebView網頁
- 獲取連線電腦的裝置的所有埠資訊
- PHP獲取上級(來路)URL相關資訊PHP
- php一句話獲取獲取檔案目錄的方法PHP
- 利用Python爬蟲獲取招聘網站職位資訊Python爬蟲網站
- 利用DBMS_METADATA包獲取許可權資訊(轉)
- JAVA通過URL連結獲取視訊檔案資訊(無需下載檔案)Java
- bat之獲取指定幾個月前的月份資訊BAT
- Linux基礎(一):獲取LinuxCPU資訊Linux
- 獲取位置資訊
- Java知識點總結(反射-獲取類的資訊)Java反射
- 爬蟲例項-淘寶頁面商品資訊獲取爬蟲
- js獲取帶#號連結後的引數JS
- php連結資料庫PHP資料庫
- 自動獲取隨筆連結(用於部落格簽名或者版權資訊)
- PHP外掛系統的實現(二):獲取全部外掛資訊PHP
- python實現微博個人主頁的資訊爬取Python
- Windows系統安全獲取重要資訊的方法(一)Windows
- 深入 Nodejs 原始碼探究 CPU 資訊的獲取與利用率計算NodeJS原始碼
- 2018-05-10 爬蟲筆記(二)一個簡單的實踐 —簡單獲取生物資訊達人博主主頁的資訊...爬蟲筆記
- 獲取.crt證書的資訊