2010-10-02 60 views
0

什麼是在PHP中編寫代碼的最佳方式,它將在網頁中搜索存儲在文件中的大量單詞?將源代碼存儲在文件中還是另一種方式最好?請幫忙。在網頁中搜索

回答

1

最好的辦法是使用谷歌:site:example.com word1 OR word2 OR word3

你想在一個頁面中進行搜索?或一個網站與多個網頁? 如果它只有一個頁面,我認爲你可以存儲在內存中的HTML代碼沒有問題。 如果你確切地知道你搜索條件達到的詞可能是最快的(stripos不區分大小寫)。你也可以定義自己的角色等級和使用preg_match_all什麼......只是這樣的事情會做...

<? 
$keywords = array("word1","word2","word3"); 
$doc = strip_tags(file_get_contents("http://www.example.com")); // remove tags to get only text 
$doc = preg_replace('/\s+/', ' ',$doc); // remove multiple whitespaces... 
foreach($keywords as $word) { 
    $pos = stripos($doc,$word); 
    if($pos !== false) { 
    echo "match: ...".str_replace($word,"<em>$word</em>",substr($doc,$pos-20,50))."... \n"; 
    } 
} 
?> 

像例如下面將基於帶O HashMap中查找更快的性能要(1)並且不需要爲每個關鍵字掃描整個文本...

<? 
setlocale(LC_ALL, "en_US.utf8"); 
$keywords = array("word1","word2","word3","word4"); 
$doc = file_get_contents("http://www.example.com"); 
$doc = strtolower($doc); 
$doc = preg_replace('!/\*.*?\*/!s', '', $doc); 
$doc = preg_replace("/<!--.*>/i", "", $doc); 
$doc = preg_replace('!<script.*?script>!s', '', $doc); 
$doc = preg_replace('!<style.*?style>!s', '', $doc); 
$doc = strip_tags($doc); 
$doc = preg_replace('/[^0-9a-z\s]/','',$doc); 
$doc = iconv('UTF-8', 'ASCII//TRANSLIT', $doc); // check if encoding is really utf8 
//$doc = preg_replace('{(.)\1+}','$1',$doc); remove duplicate chars ... possible step to add even more fuzzyness 
$doc = preg_split("/\s+/",trim($doc)); 
foreach($keywords as $word) { 
    $word = strtolower($word); 
    $word = iconv('UTF-8', 'ASCII//TRANSLIT', $word); 
    $key = array_search($word,$doc); 
    var_dump($key); 
    if($key !== false) { 
    echo "match: "; 
    for($i=$key;$i<=5 && isset($doc[$i]);$i++) { 
     echo $doc[$i]." "; 
    } 
    } 
} 
?> 

此代碼未經測試。

那就不過是更優雅的從一個DOMDocument

簡單的搜索轉儲textnodes容易。如果你想在整個網站上搜索,抓取邏輯很困難。

我曾經爲一家像爬蟲一樣工作的公司做過反向鏈接檢查。

我的第一個建議是不要做一個遞歸(如在掃描一個頁面,下面各個環節,下面的所有鏈接,直到你達到一定的水平...)

,而像這樣做:

  • 與您想要爬取的許多關卡一樣頻繁地執行for循環。

  • 設置站點陣列與一個條目(開始頁)

  • 通陣列功能下載的每一個環節,掃描網站存在並存儲在陣列上的聯繫。 當完成所有鏈接時返回新的鏈接列表數組

  • 在for循環中用函數的返回值更新數組,然後再次調用函數。

這樣,您可以避免遵循惡劣路徑,而是逐級抓取網站。 還存儲已經訪問過的數組中的鏈接跳過,不遵循外部鏈接,檢查奇怪的url參數等。

未來使用您可以將文檔存儲在lucene或solr中,有一些類可以將html頁面轉化爲有意義的lucene對象並在其中搜索。

+0

是的,它只有一個頁面,我需要搜索,我有一個文件,其中我存儲了一些關鍵字,當我在網頁中找到該關鍵字時,我想在屏幕上打印下2-3個單詞關鍵字之後。 – Bogdan 2010-10-02 20:53:47

+0

那麼這個例子對你來說很好,我更新了代碼。 – 2010-10-02 21:03:11