用Php编写代码,在网页中搜索文件中存储的大量单词,最好的方法是什么?最好是将源代码存储在一个文件中,还是另一种方式?请帮帮忙。
发布于 2010-10-03 04:47:42
最好的方法是使用谷歌:site:example.com word1 OR word2 OR word3
是否要在一页中搜索?还是一个有多个页面的网站?如果只有一个页面,我想你可以将html代码存储在内存中,没有问题。如果你确切知道你搜索strpos的是什么,那么reach word可能是最快的(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(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中转储文本节点会更优雅。
简单的搜索很容易。如果你想在整个网站中进行搜索,爬行逻辑是很困难的。
我曾经为一家像爬虫一样工作的公司做过反向链接检查。
我的第一个建议是不要做递归(比如扫描一个页面,跟踪其中的所有链接,然后跟踪其中的所有链接,直到您达到某个级别……)
更确切地说,这样做:
循环中返回新的链接列表数组
这样你就可以避免走不好的路,而是一层一层地抓取网站。在数组中存储已经访问过的链接以跳过,不跟随外部链接,检查奇怪的url参数等。
为了将来的使用,您可以将文档存储在lucene或solr中,有一些类可以将html页面转换为有意义的lucene对象并在其中进行搜索。
https://stackoverflow.com/questions/3847425
复制相似问题