我设计了一个 php 语言的网站。我的网站上有一个搜索框。现在我想让它可用意味着如果用户想要搜索任何东西,他可以在那里输入并可以获得所需的结果。这是否需要使用 php 或者使用 HTML 标签很容易发生?
5 回答
基本搜索
网站上的大多数简单搜索不会搜索网站的结构,它们使用 MySQL 中的 LIKE 语法在相关数据库表的文本字段中查找术语。因此,如果您有一个博客,您可以让您的用户以这种方式在博客正文中进行搜索,并返回包含该术语的条目列表。通过一些巧妙的计数,您甚至可以按该术语出现的次数对该列表进行排序。
在这些情况下,当用户在搜索框中键入“taco”并按 Enter 键时,用户会被带到一个 PHP 页面,该页面在数据库上运行 LIKE 查询,并向用户显示包含 Taco 一词的博客文章。
真实搜索
严格来说,以上不是网站搜索。如果您的网站包含大量平面 HTML 页面和其他以某种方式不在数据库中的页面,您将需要抓取您的网站并通过搜索该数据来公开数据。谷歌可以为你设置这个。您还可以使用各种 3rd 方工具。但是,学习如何自己构建网络爬虫可能是一个很好的练习。
以下是生成 URL 数据库的网络爬虫的基本步骤。这个兔子洞永远延伸,所以这只是您进行有效搜索所需的最低限度。
数据库
您的数据库将只有一个表。该表需要这些字段:
- (整数)ID
- (var_char) 网址
- (文字)文字
- (时间戳)LastChecked
履带式
爬虫本身需要使用 cron 调度程序连续运行或每隔几分钟运行一次。它需要执行这些最低限度的操作:
- 从数据库中加载具有最早 LastChecked 时间的页面。(如果数据库中没有页面,则为根页面)
- 更新 LastChecked 时间。
- 使用 cURL 或其他方法从页面获取 HTML。
- 如果页面的文本内容已更改,请更新此 URL 的数据库记录。
- 查找页面上的所有锚标记
<a href="http://www.mysite.com/taco/">Tacos!</a>
并创建所有这些 URL 的数组。 - 修剪列表中不在您网站上的所有链接。(否则,您将抓取整个网络)
- 如果 URL 尚未在数据库中,请添加它。收获页面的文本并同时插入。
- 从 1 开始重复。
显然,这只会创建所有页面及其上的文本的列表,但这足以使您能够使用基本搜索中的相同技术来为您的站点创建搜索。
改进
您可以通过一些简单的方法改进上述爬虫。
- 在表格上添加一个“错误”字段。如果 URL 有 HTML 错误代码且没有数据,则存储该代码。您可以从搜索中排除这些内容,同时它会像一个方便的链接检查器一样工作。
- 您可以添加一个新表用于在您存储的位置进行排名:URL ID、计数和 URL 的检查状态。正常运行站点上的每个 URL 并更新此表上的计数。检查主列表中的所有 URL 后,将“计数”移动到主表中的新“排名”字段。转储排名表并重新开始。您将拥有一个不断更新的页面排名,您可以根据这些排名对结果进行排序。
- 您可以通过在每次抓取时存储整个页面内容的 MD5 哈希来收集自动“上次更改”数据,每当您重新抓取页面并且此 MD5 更改时,您可以存储新文本并向新表添加时间戳更改时间和 URL ID。使用此数据,您可以构建页面的预期更改率。然后,您可以将“偏移”字段添加到主表,并将其添加到 LastChecked 的所有时间戳。这样,您重新排序主列表以比其他页面更频繁地重新检查某些页面,因为它们更新更多。
最简单的方法是添加谷歌(或其他搜索引擎)站点搜索。您不需要 PHP,但需要一点 HTML。
虽然 google 站点搜索是最简单的解决方案,但您也可以使用自己的 PHP 搜索解决方案或使用 3rd 方脚本,例如这个
3rd 方搜索蜘蛛脚本(我自己也没有使用过它,也没有附属,它是您可能在互联网上找到的一种脚本的示例,而不是推荐)
最好的事情是你应该使用谷歌搜索来实现谷歌搜索并不难。您必须提供有关您的网站的信息,并且将生成一个脚本,您必须将其放在您的 html 页面上
您无法使用 HTML 标记执行此类功能。PHP 在技术上不是必需的(有替代方案),但在您的情况下,可能的答案是:是的,您需要使用 PHP。
这是搜索栏的 php 代码
HOME html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn , em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, input , textarea, fieldset, legend, table, caption, tbody, tfoot, thead, tr, th, td { margin:0; 填充:0;边界:0;大纲:0;}
$keyword=trim($_POST["keyword"]);
//check if the keyword is empty
if($keyword==""){
echo"no keywords";
exit;
}
//With above, you can give hints to your users when they forget to enter a keyword. Now let's go through all the files or articles in your website.
function listFiles($dir){
$handle=opendir($dir);
while(false!==($file=readdir($handle))){
if($file!="."&&$file!=".."){
//if it is a directory, then continue
if(is_dir("$dir/$file")){
listFiles("$dir/$file");
}
else{
//process the searching here with the following PHP script
}
}
}
}
//The following scripts read, process files and check whether the files contain $keyword. If $keyword is found in the file, the file address will be saved in an array-type variable.
function listFiles($dir,$keyword,&$array){
$handle=opendir($dir);
while(false!==($file=readdir($handle))){
if($file!="."&&$file!=".."){
if(is_dir("$dir/$file")){
listFiles("$dir/$file",$keyword,$array);
}
else{
//read file
$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
//avoid search search.php itself
if($file!="search.php"){
//contain keyword?
if(eregi("$keyword",$data)){
if(eregi("(.+)",$data,$m)){
$title=$m["1"];
}
else{
$title="no title";
}
$array[]="$dir/$file $title";
}
}
}
}
}
}
//define array $array
$array=array();
//execute function
listFiles(".","php",$array);
//echo/print search results
foreach($array as $value){
list($filedir,$title)=split("[ ]",$value,"2");
echo "$value"."
\n";
}
?>
hello
</body>
</html>