2010-10-02 58 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