国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

揭秘PHP開發搜索引擎技術全過程

2024-05-04 21:52:16
字體:
來源:轉載
供稿:網友

談到網頁搜索引擎時,很多人都會想到雅虎。的確,雅虎開創了一個互聯網絡的搜索時代。然而,雅虎目前用于搜索網頁的技術卻并非該公司原先自己開發的。2000年8月,雅虎采用了Google這家由斯坦福大學學生創建的公司的技術。理由非常簡單,Google的搜索引擎比雅虎先前使用的技術能更快、更準確搜索到所需要的信息。

讓我們自己來設計、開發一個強勁、高效的搜索引擎和數據庫恐怕短時間內在技術、資金等方面是不可能的,不過,既然雅虎都在使用別人的技術,那么我們是不是也可以使用別人現成的搜索引擎網站呢?

剖析編程思路

我們可以這樣設想:模擬一個查詢,向某個搜索引擎網站發出相應格式的搜索命令,然后傳回搜索結果,對結果的HTML代碼進行分析,剝離多余的字符和代碼,最后按所需要的格式顯示在我們自己的網站頁面里。

這樣,問題的關鍵就在于,我們要選定一個搜索信息準確(這樣我們的搜索才會更有意義啊)、速度快(因為我們分析搜索結果并顯示需要額外的時間),搜索結果簡潔(便于進行HTML源代碼分析和剝離)的搜索網站,由于新一代搜索引擎Google的各種優良特性,這里我們選擇它為例,來看看用PHP怎樣實現后臺對Google搜索、前臺個性化顯示這一過程。

我們先來看看Google的查詢命令的構成。進入Google網站,在查詢欄中輸入“abcd”,點擊查詢按鈕,我們可以發明閱讀器的地址欄變成:"http://www.google.com/search?q=abcd&btnG=Google%CB%D1%CB%F7&hl=zh-CN&lr= ",可見,Google是通過表單的get方法來傳遞查詢參數并遞交查詢命令的。我們可以使用PHP中的file()函數來模仿這個查詢進程。
懂得File( ) 函數
語法: array file(string filename);
返回值為數組,將文件全體讀進數組變量中。這里的文件可以是本地的,也可以是遠程的,遠程文件必需指明所應用的協定。例如: result=file(“http://www.google.com/search?q=a ... mp;hl=zh-CN&lr= ”),該語句將模仿我們在Google上查詢單詞“abcd”的進程,并將搜索結果以每行動元素,傳回到數組變量 result中。由于這里讀取的文件是遠程的,所以協定名“http://”不能缺乏。
假如要讓用戶輸入搜索字符進行任意搜索,我們可以做一個輸入文本框和提交按鈕,并將上文中的被搜索字符“abcd”用變量替換:
echo '
'; file://沒有參數的form,默認提交方法為get,提交到本身
echo '; file://結構一個文本輸入框
echo '; file://結構一個提交查詢按鈕
echo '
';
if (isset( keywords)) file://提交后PHP會天生變量 kwywords,即請求下面的程序在提交后運行
{
urlencode( keywords); file://對用戶輸進內容進行URL編碼
result=file("http://www.google.com/search?q=". keywords."&btnG=Google%CB%D1%CB%F7&hl=zh-CN&lr=");
file://對查詢語句進行變量調換,將查詢成果保留在數組變量 result中
result_string=join(" ", result); file://將數組$result合并成字符串,各數組元素之間用空格粘和
... file://進一步處理
}
??
上面的這段程序已經能按用戶輸入內容進行查詢,并將返回的結果合成一個字符串變量$result_string。請注意要應用urlencode()函數將用戶輸進內容進行URL編碼,才可以正常地對輸入的漢字、空格以及其他特別字符進行查詢,這樣做也是盡可能真切地模仿Google的查詢命令,保證搜索成果的準確性。
對Google的剖析
為了便于懂得,現在假設我們所真正需要的東西是:搜索結果的標題。網址和簡介等,這是一個簡練而典范的需求。這樣,我們所要做的便是:去除Google搜索結果的臺頭和腳注,包含一個Google的標記、再次搜索的輸入框和搜索結果闡明等,并且在剩余的搜索結果各項條目中剝離本來的HTML格式標記,替換成我們想要的格式。
要做到這一點,我們必需細心地剖析Google搜索結果的HTML源碼,找到其中的規律。不難發明,在Google的搜索結果的正文總是包括在源碼的第一個
標記和倒數第二個
標志之間,并且倒數第二個
標志后緊跟table字符,而且這個組合“
以下所有程序均依次接續在上文程序的“進一步處置”處。
result_string = strstr( result_string, " ");
file://取 result_string從第一個開端后的字符串,以往除Google臺頭
position= strpos( result_string," table符號的地位
result_string= substr( result_string,0, position);//截取第一個table符號之前的字符串,以往除腳注
利用與實現
現在我們已經得到有用的HTML源碼主干了,剩下的問題是如何自主地顯示這些內容。我們再剖析一下這些搜索結果條目,發明每個條目之間也是很有規律的用分隔,也就是各成一個段落,按這個特色我們用explode()函數把每個條目切開:
語法:explode(string separator, string string);
返回一個數組,按separator切開后的各個小字串被保留在數組中。
于是:
result_array=explode(" ", result_string); file://用字串" "把成果切開
我們就得到一個數組 result_array,其中每個元素都是一個搜索結果條目。我們所要做的僅僅是研討每個條目及其HTML顯示格式代碼,然后按請求替換就行了。下面用循環來處理 result_array中的每個條目。
for( i=0; i {
... file://處理每個條目
}
對于每個條目,我們也很輕易找到一些特色:每個條目都由題目、摘要、簡介、種別、網址等組成,每個部分都換行,即包括標志,于是再次分割:(以下處置程序放在上文的循環中)
every_item=explode(" ", result_array[ i]);
這樣我們得到一個數組 every_item,其中 every_item[0]就是題目, every_item[1]和 every_item[2]兩行動摘要, every_item[3]和 every_item[4]等等的頭部如果包含“簡介:”、“< font size=-1 color=#6f6f6f>種別:< /font>”字符,則是簡介或類別(由于有的結果條目沒有該項),假如頭部包含“< font color=green>”則確定就是網址啦,這種對照斷定我們常使用正則表達式(略),假如要替換也很便利,比如包括標題的$every_item[0],其本身是有鏈接的,我們盼望修改這個鏈接屬性,讓它在新窗口打開鏈接:
echo eregi_replace(' {
... file://處置每個條目中除往第一項(第一項為題目,已經顯示)的每一項
... file://更多格局修正
}
這樣就修改了鏈接屬性,其余很多顯示格局的修正、剝離、調換都能用正則調換eregi_replace()來完成。
至此我們已經得到了每個搜索條目標每一項,并能任意修正每項的格局,甚至可以給他套上美麗的表格。然而一個好的程序應當能適應各種運行環境的,這里也不例外,我們實在還只是討論了搜索結果的HTML剝離的一種框架方式,真正要做得完善,還要斟酌很多內容,比如要顯示一共搜索出多少結果,分成多少頁等等,甚至還可以刨除與Google相干的那些“種別”、“簡介”等代碼,讓客戶基本看不到原始網站。不過這些內容和請求我們都能通過火析HTML進行剝離得到。現在大家完整能自己動手,做個極富個性化的搜索引擎。
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 清涧县| 酉阳| 余庆县| 南安市| 龙口市| 荆州市| 津南区| 文成县| 额尔古纳市| 宜丰县| 金溪县| 尉氏县| 鹰潭市| 虎林市| 毕节市| 乐山市| 会宁县| 通许县| 永和县| 铁岭市| 基隆市| 清远市| 清流县| 綦江县| 五常市| 瑞安市| 芷江| 石河子市| 体育| 西乌| 吴忠市| 连州市| 都江堰市| 高唐县| 石台县| 乃东县| 北流市| 阿坝| 合作市| 太康县| 乌兰察布市|