在Php中编写代码的最佳方法是在网页中搜索存储在文件中的多个单词?最好将源代码存储在文件中还是以其他方式存储?请帮忙。
答案 0 :(得分:1)
最好的方法是使用谷歌:site:example.com word1 OR word2 OR word3
你想在一页上搜索吗?或者一个有多个页面的网站? 如果只有一页,我认为你可以将html代码存储在内存中而不会出现问题。 如果你确切地知道你搜索strpos for reach word可能是最快的(条件不区分大小写)。你也可以定义你自己的角色类并使用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)的hashmap查找,并且不需要扫描每个关键字的整个文本...
<?
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循环。
设置一个包含一个条目的站点数组(起始页)
将数组传递给函数下载每个链接,在那里扫描站点并在其中存储链接。 完成所有链接后返回新的链接列表数组
使用函数的返回值更新数组,并再次调用该函数。
为了将来的使用,您可以将文档存储在lucene或solr中,有些类可以将html页面转换为有意义的lucene对象并在其中进行搜索。