亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁(yè) php教程 php手冊(cè) 搜索引擎技術(shù)核心揭密(PHP)

搜索引擎技術(shù)核心揭密(PHP)

Jun 21, 2016 am 09:14 AM
google lt quot string

搜索引擎

作者:沙雨

編者按:這是一篇精彩的編程教學(xué)文章,不但詳細(xì)地剖析了搜索引擎的原理,也提供了筆者自己對(duì)使用PHP編制搜索引擎的一些思路。整篇文章深入淺出,相信無(wú)論是高手還是菜鳥(niǎo),都能從中得到不少的啟發(fā)。

  談到網(wǎng)頁(yè)搜索引擎時(shí),大多數(shù)人都會(huì)想到雅虎。的確,雅虎開(kāi)創(chuàng)了一個(gè)互聯(lián)網(wǎng)絡(luò)的搜索時(shí)代。然而,雅虎目前用于搜索網(wǎng)頁(yè)的技術(shù)卻并非該公司原先自己開(kāi)發(fā)的。2000年8月,雅虎采用了Google(www.google.com)這家由斯坦福大學(xué)學(xué)生創(chuàng)建的風(fēng)險(xiǎn)公司的技術(shù)。理由非常簡(jiǎn)單,Google的搜索引擎比雅虎先前使用的技術(shù)能更快、更準(zhǔn)確搜索到所需要的信息。

  讓我們自己來(lái)設(shè)計(jì)、開(kāi)發(fā)一個(gè)強(qiáng)勁、高效的搜索引擎和數(shù)據(jù)庫(kù)恐怕短時(shí)間內(nèi)在技術(shù)、資金等方面是不可能的,不過(guò),既然雅虎都在使用別人的技術(shù),那么我們是不是也可以使用別人現(xiàn)成的搜索引擎網(wǎng)站呢?

剖析編程思路

  我們可以這樣設(shè)想:模擬一個(gè)查詢,向某個(gè)搜索引擎網(wǎng)站發(fā)出相應(yīng)格式的搜索命令,然后傳回搜索結(jié)果,對(duì)結(jié)果的HTML代碼進(jìn)行分析,剝離多余的字符和代碼,最后按所需要的格式顯示在我們自己的網(wǎng)站頁(yè)面里。

  這樣,問(wèn)題的關(guān)鍵就在于,我們要選定一個(gè)搜索信息準(zhǔn)確(這樣我們的搜索才會(huì)更有意義?。?、速度快(因?yàn)槲覀兎治鏊阉鹘Y(jié)果并顯示需要額外的時(shí)間),搜索結(jié)果簡(jiǎn)潔(便于進(jìn)行HTML源代碼分析和剝離)的搜索網(wǎng)站,由于新一代搜索引擎Google的各種優(yōu)良特性,這里我們選擇它為例,來(lái)看看用PHP怎樣實(shí)現(xiàn)后臺(tái)對(duì)Google(www.google.com)搜索、前臺(tái)個(gè)性化顯示這一過(guò)程。

  我們先來(lái)看看Google的查詢命令的構(gòu)成。進(jìn)入www.google.com網(wǎng)站,在查詢欄中輸入“abcd”,點(diǎn)擊查詢按鈕,我們可以發(fā)現(xiàn)瀏覽器的地址欄變成:"http://www.google.com/search?q=abcd&btnG=Google%CB%D1%CB%F7&hl=zh-CN&lr=",可見(jiàn),Google是通過(guò)表單的get方式來(lái)傳遞查詢參數(shù)并遞交查詢命令的。我們可以使用PHP中的file()函數(shù)來(lái)模擬這個(gè)查詢過(guò)程。

了解File()函數(shù)

  語(yǔ)法: array file(string filename);

  返回值為數(shù)組,將文件全部讀入數(shù)組變量中。這里的文件可以是本地的,也可以是遠(yuǎn)程的,遠(yuǎn)程文件必須指明所使用的協(xié)議。例如: result=file(“http://www.google.com/search?q=abcd&btnG=Google%CB%D1%CB%F7&hl=zh-CN&lr=”),該語(yǔ)句將模擬我們?cè)贕oogle上查詢單詞“abcd”的過(guò)程,并將搜索結(jié)果以每行為元素,傳回到數(shù)組變量 result中。因?yàn)檫@里讀取的文件是遠(yuǎn)程的,所以協(xié)議名“http://”不能缺少。

  如果要讓用戶輸入搜索字符進(jìn)行任意搜索,我們可以做一個(gè)輸入文本框和提交按鈕,并將上文中的被搜索字符“abcd”用變量替換:
echo '

'; //沒(méi)有參數(shù)的form,默認(rèn)提交方式為get,提交到本身
echo ''; //構(gòu)造一個(gè)文本輸入框
echo ''; //構(gòu)造一個(gè)提交查詢按鈕
echo '
';

if (isset( keywords)) //提交后PHP會(huì)生成變量 kwywords,即要求下面的程序在提交后運(yùn)行
{
urlencode( keywords); //對(duì)用戶輸入內(nèi)容進(jìn)行URL編碼
result=file("http://www.google.com/search?q=". keywords."&btnG=Google%CB%D1%CB%F7&hl=zh-CN&lr=");
//對(duì)查詢語(yǔ)句進(jìn)行變量替換,將查詢結(jié)果保存在數(shù)組變量 result中
result_string=join(" ", result); //將數(shù)組$result合并成字符串,各數(shù)組元素之間用空格粘和
... //進(jìn)一步處理
}
?>

  上面的這段程序已經(jīng)能按用戶輸入內(nèi)容進(jìn)行查詢,并將返回的結(jié)果合成一個(gè)字符串變量$result_string。請(qǐng)注意要使用urlencode()函數(shù)將用戶輸入內(nèi)容進(jìn)行URL編碼,才可以正常地對(duì)輸入的漢字、空格以及其他特殊字符進(jìn)行查詢,這樣做也是盡可能逼真地模擬Google的查詢命令,保證搜索結(jié)果的正確性。

對(duì)Google的分析

  為了便于理解,現(xiàn)在假設(shè)我們所真正需要的東西是:搜索結(jié)果的標(biāo)題。網(wǎng)址和簡(jiǎn)介等,這是一個(gè)簡(jiǎn)潔而典型的需求。這樣,我們所要做的便是:去除Google搜索結(jié)果的臺(tái)頭和腳注,包括一個(gè)Google的標(biāo)志、再次搜索的輸入框和搜索結(jié)果說(shuō)明等,并且在剩余的搜索結(jié)果各項(xiàng)條目中剝離原來(lái)的HTML格式標(biāo)記,替換成我們想要的格式。

  要做到這一點(diǎn),我們必須仔細(xì)地分析Google搜索結(jié)果的HTML源碼,找到其中的規(guī)律。不難發(fā)現(xiàn),在Google的搜索結(jié)果的正文總是包含在源碼的第一個(gè)

標(biāo)記和倒數(shù)第二個(gè)

標(biāo)記之間,并且倒數(shù)第二個(gè)

標(biāo)記后緊跟table字符,而且這個(gè)組合“


  以下所有程序均依次接續(xù)在上文程序的“進(jìn)一步處理”處。

  result_string = strstr( result_string, "

"); //取 result_string從第一個(gè)

開(kāi)始后的字符串,以去除Google臺(tái)頭
position= strpos( result_string,"

table符號(hào)的位置
result_string= substr( result_string,0, position);//截取第一個(gè)

table符號(hào)之前的字符串,以去除腳注

應(yīng)用與實(shí)現(xiàn)

  OK,現(xiàn)在我們已經(jīng)得到有用的HTML源碼主干了,剩下的問(wèn)題是如何自主地顯示這些內(nèi)容。我們?cè)俜治鲆幌逻@些搜索結(jié)果條目,發(fā)現(xiàn)每個(gè)條目之間也是很有規(guī)律的用
分隔,也就是各成一個(gè)段落,按這個(gè)特點(diǎn)我們用explode()函數(shù)把每個(gè)條目切開(kāi):

  語(yǔ)法:explode(string separator, string string);

  返回一個(gè)數(shù)組,按separator切開(kāi)后的各個(gè)小字串被保存在數(shù)組中。

  于是:
result_array=explode("

", result_string); //用字串"

"把結(jié)果切開(kāi)

  我們就得到一個(gè)數(shù)組 result_array,其中每個(gè)元素都是一個(gè)搜索結(jié)果條目。我們所要做的僅僅是研究每個(gè)條目及其HTML顯示格式代碼,然后按要求替換就行了。下面用循環(huán)來(lái)處理 result_array中的每個(gè)條目。
for( i=0; i {
... //處理每個(gè)條目
}

  對(duì)于每個(gè)條目,我們也很容易找到一些特點(diǎn):每個(gè)條目都由標(biāo)題、摘要、簡(jiǎn)介、類別、網(wǎng)址等組成,每個(gè)部分都換行,即包含
標(biāo)記,于是再次分割:(以下處理程序放在上文的循環(huán)中)
every_item=explode("
", result_array[ i]);

  這樣我們得到一個(gè)數(shù)組 every_item,其中 every_item[0]就是標(biāo)題, every_item[1]和 every_item[2]兩行為摘要, every_item[3]和 every_item[4]等等的頭部如果包含“簡(jiǎn)介:”、“類別:”字符,則是簡(jiǎn)介或類別(因?yàn)橛械慕Y(jié)果條目沒(méi)有該項(xiàng)),如果頭部包含“”則肯定就是網(wǎng)址啦,這種對(duì)比判斷我們常使用正則表達(dá)式(略),如果要替換也很方便,比如包含標(biāo)題的$every_item[0],其本身是有鏈接的,我們希望修改這個(gè)鏈接屬性,讓它在新窗口打開(kāi)鏈接:
echo eregi_replace(' {
... //處理每個(gè)條目中除去第一項(xiàng)(第一項(xiàng)為標(biāo)題,已經(jīng)顯示)的每一項(xiàng)
... //更多格式修改
}

  這樣就修改了鏈接屬性,其余很多顯示格式的修改、剝離、替換都能用正則替換eregi_replace()來(lái)完成。

  至此我們已經(jīng)得到了每個(gè)搜索條目的每一項(xiàng),并能任意修改每項(xiàng)的格式,甚至可以給他套上漂亮的表格。然而一個(gè)好的程序應(yīng)該能適應(yīng)各種運(yùn)行環(huán)境的,這里也不例外,我們其實(shí)還只是討論了搜索結(jié)果的HTML剝離的一種框架方法,真正要做得完美,還要考慮很多內(nèi)容,比如要顯示一共搜索出多少結(jié)果,分成多少頁(yè)等等,甚至還可以刨除與Google相關(guān)的那些“類別”、“簡(jiǎn)介”等代碼,讓客戶根本看不到原始網(wǎng)站。不過(guò)這些內(nèi)容和要求我們都能通過(guò)分析HTML進(jìn)行剝離得到。現(xiàn)在大家完全能自己動(dòng)手,做個(gè)極富個(gè)性化的搜索引擎啦。



本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
Google Pixel 9 Pro XL 接受桌面模式測(cè)試 Google Pixel 9 Pro XL 接受桌面模式測(cè)試 Aug 29, 2024 pm 01:09 PM

Google在 Pixel 8 系列中引入了 DisplayPort 替代模式,並且在新推出的 Pixel 9 系列中也採(cǎi)用了該模式。雖然它主要是為了讓您透過(guò)連接的螢?zāi)荤R像智慧型手機(jī)顯示,但您也可以將其用於桌面

傳聞 Google Pixel 9 和 Pixel 9 Pro 將在發(fā)佈時(shí)配備 Creative Assistant AI 傳聞 Google Pixel 9 和 Pixel 9 Pro 將在發(fā)佈時(shí)配備 Creative Assistant AI Jun 22, 2024 am 10:50 AM

目前,四款新 Pixel 智慧型手機(jī)預(yù)計(jì)將於今年秋季上市?;仡櫼幌?,據(jù)傳該系列將在發(fā)佈時(shí)推出 Pixel 9 和 Pixel 9 Pro。然而,Pixel 9 Pro 將成為 iPhone 16 Pro 的競(jìng)爭(zhēng)對(duì)手,而不是 Pixel 8 Pro(目前)

Google AI 為開(kāi)發(fā)者發(fā)佈 Gemini 1.5 Pro 和 Gemma 2 Google AI 為開(kāi)發(fā)者發(fā)佈 Gemini 1.5 Pro 和 Gemma 2 Jul 01, 2024 am 07:22 AM

從 Gemini 1.5 Pro 大語(yǔ)言模型 (LLM) 開(kāi)始,Google AI 已開(kāi)始為開(kāi)發(fā)人員提供擴(kuò)展上下文視窗和節(jié)省成本的功能。以前可透過(guò)等候名單獲得完整的 200 萬(wàn)個(gè)代幣上下文窗口

Pixel 9 Pro XL 的 Google Tensor G4 在 原神 方面落後於 Tensor G2 Pixel 9 Pro XL 的 Google Tensor G4 在 原神 方面落後於 Tensor G2 Aug 24, 2024 am 06:43 AM

谷歌最近回應(yīng)了有關(guān) Pixel 9 系列 Tensor G4 性能的擔(dān)憂。該公司表示,該 SoC 的設(shè)計(jì)初衷並不是為了超越基準(zhǔn)。相反,該團(tuán)隊(duì)專注於使其在 Google 想要的領(lǐng)域中表現(xiàn)良好。

Google app beta APK teardown reveals new extensions coming to Gemini AI assistant Google app beta APK teardown reveals new extensions coming to Gemini AI assistant Jul 30, 2024 pm 01:06 PM

Google's AI assistant, Gemini, is set to become even more capable, if the APK teardown of the latest update (v15.29.34.29 beta) is to be considered. The tech behemoth's new AI assistant could reportedly get several new extensions. These extensions wi

新的 Google Pixel 桌面模式在新鮮影片中展示,可能是 Motorola Ready For 和 Samsung DeX 的替代方案 新的 Google Pixel 桌面模式在新鮮影片中展示,可能是 Motorola Ready For 和 Samsung DeX 的替代方案 Aug 08, 2024 pm 03:05 PM

自從 Android Authority 展示Google隱藏在 Android 14 QPR3 Beta 2.1 中的新 Android 桌面模式以來(lái),已經(jīng)過(guò)了幾個(gè)月。緊接著 Google 為 Pixel 8 和 Pixel 8 新增 DisplayPort Alt 模式支援之後

儘管做出了七年更新承諾,Google Pixel 9 智慧型手機(jī)仍不會(huì)搭載 Android 15 儘管做出了七年更新承諾,Google Pixel 9 智慧型手機(jī)仍不會(huì)搭載 Android 15 Aug 01, 2024 pm 02:56 PM

Pixel 9 系列即將上市,原定於 8 月 13 日發(fā)布。根據(jù)最近的傳言,Pixel 9、Pixel 9 Pro 和 Pixel 9 Pro XL 將與 Pixel 8 和 Pixel 8 Pro(亞馬遜售價(jià) 749 美元)一樣,配備 128 GB 儲(chǔ)存空間。

據(jù)傳谷歌的新 Chromecast'TV Streamer”將推出以太網(wǎng)和線程連接 據(jù)傳谷歌的新 Chromecast'TV Streamer”將推出以太網(wǎng)和線程連接 Aug 01, 2024 am 10:21 AM

谷歌距離全面展示新硬體還有大約兩週的時(shí)間。像往常一樣,無(wú)數(shù)消息來(lái)源洩露了有關(guān)新 Pixel 設(shè)備的詳細(xì)信息,無(wú)論是 Pixel Watch 3、Pixel Buds Pro 2 還是 Pixel 9 智慧型手機(jī)??磥?lái)公司也

See all articles