首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在网页中搜索

在网页中搜索
EN

Stack Overflow用户
提问于 2010-10-03 04:33:06
回答 1查看 512关注 0票数 0

用Php编写代码,在网页中搜索文件中存储的大量单词,最好的方法是什么?最好是将源代码存储在一个文件中,还是另一种方式?请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-03 04:47:42

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

是否要在一页中搜索?还是一个有多个页面的网站?如果只有一个页面,我想你可以将html代码存储在内存中,没有问题。如果你确切知道你搜索strpos的是什么,那么reach word可能是最快的(stripos表示不区分大小写)。您还可以定义自己的字符类并使用preg_match_all或其他什么……就像这样就行了……

代码语言:javascript
复制
<?
$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(1)的哈希图查找,并且不需要扫描整个文本中的每个关键字……

代码语言:javascript
复制
<?
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中转储文本节点会更优雅。

简单的搜索很容易。如果你想在整个网站中进行搜索,爬行逻辑是很困难的。

我曾经为一家像爬虫一样工作的公司做过反向链接检查。

我的第一个建议是不要做递归(比如扫描一个页面,跟踪其中的所有链接,然后跟踪其中的所有链接,直到您达到某个级别……)

更确切地说,这样做:

  • 尽可能频繁地执行一次for循环,只要你想抓取多少层。
  • 设置一个只有一个入口(起始页)的站点数组,
  • 将数组传递给一个函数,下载每个链接,扫描那里的站点,并将链接存储在数组中。完成所有链接后,在

循环中返回新的链接列表数组

  • ,使用函数的返回值更新数组,然后再次调用该函数。

这样你就可以避免走不好的路,而是一层一层地抓取网站。在数组中存储已经访问过的链接以跳过,不跟随外部链接,检查奇怪的url参数等。

为了将来的使用,您可以将文档存储在lucene或solr中,有一些类可以将html页面转换为有意义的lucene对象并在其中进行搜索。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3847425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档