PHP匹配变音使404页面愈加智能化-Php-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝29
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:232回复:0

  PHP匹配变音使404页面愈加智能化

楼主#
更多 发布于:2016-05-21 23:11

创立您自个的 404

错识音讯处理程序,为站点内容供给有用的连接和重定向。运用变音匹配(metaphone

matching)和一个简略的加权记分文件为输入过错、拼写过错和无效连接生成重定向主张。依据 Web 站点的内容和首选重定向方位定制主张。捕获传入 URL

恳求中的各种过错,

创立您自个的 404

错识音讯处理程序,为站点内容供给有用的连接和重定向。运用变音匹配(metaphone

matching)和一个简略的加权记分文件为输入过错、拼写过错和无效连接生成重定向主张。依据 Web 站点的内容和首选重定向方位定制主张。捕获传入 URL

恳求中的各种过错,并经过处理纠正其中的目录、脚本和 HTML 页面称号过错。

关于如何为 404 页面创立有用格式的教程举目皆是。这类教程大多主张在 404

页面中包括静态的主张连接,并将这些连接指向站点的公共区域,比如说主页、下载页面和站点的查找引擎,条件是要有这些页面。404

页面普遍存在的问题是它们无法反映用户拜访该站点的意图。这篇文章将介绍如何构建一个主张生成器和一个办法,用于依据 Web

站点的内容供给愈加有用的重定向连接。

现行的 404

处理程序答应咱们为各种过错供给一些主张连接,比如说将用户指向站点目录。一些拼写校对程序(比如说 mod_speling ——— 没错,它只有一个

“l”)可用于纠正词典单词中的过错,然后将用户定向到精确的页面。这篇文章中的代码将帮助您构建一个主张生成引擎,它能够依据 Web

站点的内容来处理在词典中无法找到的单词和目录连接。

咱们思考这么一个场景:您在电话会议悦耳到了一个 Web 页面称号,因而便测验翻开

blegs/DavSmath.html 连接。现行的拼写校对模块无法为此状况供给一个有用的连接。运用这篇文章中的代码,您将能够生成一个 404

页面,并在其中显现主张的有用页面 /blogs/DaveSmith.html。

需求

本世纪出产的任何现代 PC 应当都足以编写和运转这篇文章中的代码。假如您的 Web 页面富含超过

10,000 个不一样的页面,那么也许需求大容量的内存、高性能的硬件或足够的耐性。

所供给的 Perl 和 CGI 脚本能够在多种 UNIX® 和 Windows® 平台上运转(请参阅

下载有些。尽管这篇文章将运用 Apache 和一个 CGI 脚本作为主张引擎,可是所构建的东西应当能够在大多数 Web

服务器上正常运转。关于变音匹配,这篇文章将引证 Michael Schwern 编写的 Text::Metaphone 模块。在开端之前,先经过喜爱的 CPAN

镜像装置 Text::Metaphone 模块。请参阅 参考资料 取得下载信息。

Web 服务器页面和变音代码

关于输入和拼写过错供给代替主张的首要办法为变音匹配。与 Soundex

语音算法和一些别的算法相似,Metaphone 运用字母数字代码表明单词的发音。可是,与 Soundex

语音算法有所不一样,构建语音代码的意图是匹配英文发音的言语可变性。因而,变音代码一般能够愈加精确地表明特定的单词,而且为主张库的构建供给了理论基础。

思考示例 Web 服务器目录中的下列文件。

清单 1. Web 服务器文件

以下为引证的内容:

./index.html

./survey.html

./search_tips.html

./about.html

./how.html

./why.html

./who.html

./NathanHarrington.html

./blogs/NathanHarrington.html

./blogs/DaveSmith.html

./blogs/MarkCappel.html

关于这些静态 HTML 文件,咱们将运用 buildMetaphoneList.pl

程序为一切拓展名为 .html 的文件创立变音。

清单 2. buildMetaphoneList.pl

以下为引证的内容:

#!/usr/bin/perl -w

# buildMetaphoneList.pl - / split filename, 0

score, metaphones

use strict;

use File::Find;

use Text::Metaphone;

find(\&htmlOnly,".");

sub htmlOnly

{

if( $File::Find::name =~ /\.html/ )

{

my $clipFname = $File::Find::name;

$clipFname =~ s/\.html//g;

my @slParts = split '/', $clipFname;

shift(@slParts);

print "$File::Find::name ### 0 ### ";

for( @slParts ){ print Metaphone($_) . " " }

print "\n";

}#if a matching .html file

}#htmlOnly sub

buildMetaphoneList.pl 程序只能处理拓展名为 .html

的文件,它将移除文件名中的 .html,然后为完好途径称号的各个有些生成变音。将 buildMetaPhoneList.pl 程序复制到 Web

服务器的根目录下,然后运转指令 perl buildMetaphoneList.pl > metaphonesScore.txt。关于清单 1

中的文件,相应的 metaphonesScore.txt 文件内容如清单 3 所示。

清单 3. metaphonesScore.txt

以下为引证的内容:

./index.html ### 0 ### INTKS

./survey.html ### 0 ### SRF

./search_tips.html ### 0 ### SRXTPS

./about.html ### 0 ### ABT

./how.html ### 0 ### H

./why.html ### 0 ### H

./who.html ### 0 ### H

./NathanHarrington.html ### 0 ### N0NHRNKTN

./blogs/NathanHarrington.html ### 0 ### BLKS

N0NHRNKTN

./blogs/DaveSmith.html ### 0 ### BLKS TFSM0

./blogs/MarkCappel.html ### 0 ### BLKS MRKKPL

清单 3 中的每一行文字都显现了 Web

服务器根目录下的实践连接、默许效果域和变音代码。留意,how.html、 why.html 和 who.html

都解析为了一样的变音代码。要处理这个不明确的当地,需求修正效果域字段,让连接主张程序以指定的次序向页面供给连接。比如说,将 “H” 变音条目修正为:

以下为引证的内容:

./how.html ### 100 ### H

./why.html ### 50 ### H

./who.html ### 0 ### H

这么将创立一个直观的连接重排序,并留下空间用于效果域的进一步修正。效果域的数字越大,刺进同一变音文件(不过是不一样的效果域)的次序就越靠后。比如说添加一个效果域为

25 的 hoo.html 文件列表,那么它将坐落 who.html 条目之上和 why.html 条目之下。

您还能够运用效果域字段区别目录不一样而称号一样的文件。比如说,将

./NathanHarrington.html 一行的的效果域修正为 100,那么相似 nathenHorrington.html 这么的恳求会将

./NathanHarrington.html 连接列在 ./blogs/NathanHarrington.html 页面之前。

挑选文件的效果域时,务必要思考 Web 站点的统计和逻辑拜访组件。从日志文件能够看出,用户对

why.html 页面的恳求对比频频,可是假如您以为 how.html 关于用户更为重要,那么只需修正相应的效果域值对排序做出纠正。

构建 CGI 404 处理程序

咱们现已生成了恰当的变音并为它们指定了有关的效果域值,下一步将构建实践的主张生成器。一般,404

过错音讯的原因为连接输入过错或连接自身的问题。以下代码生成的主张将经过以下三个首要测验创立:依据目录构造匹配、运用变音组合匹配,以及当别的办法失败时运用

“包括” 匹配。这三种测验的规划意图是处理大多数 404 过错。MetaphoneSuggest CGI Perl 脚本的开端有些如下所示。

清单 4. MetaphoneSuggest CGI 第 1 有些

以下为引证的内容:

#!/usr/bin/perl -w

# MetaphoneSuggest - suggest links for

typographical and other errors from 404s

use strict;

use CGI::Pretty ':standard';  #standard cgi

stuff

use Text::Metaphone;

my @suggestLinks = (); # suggested link list

my %mt = ();           # filename, score,

metaphone code hash

my $origLink = substr($ENV{REDIRECT_URL},1); #

remove leading /

$origLink  =~ s/\.html//g;                   #

remove trailing .html

open(MPH,'metaphonesScore.txt') or die "can't open

metaphones";

while(my @slPart = split '###',)

{

$slPart[0] =~ s/ //g; #remove trailing space

$mt{$slPart[0]}{ score } = $slPart[1];

$mt{$slPart[0]}{ metaphones } = $slPart[2];

}

close(MPH);

代码首要引入了一些常用库并声明晰一些变量,然后将加载 404 陈述文本和经过

buildMetaphoneList.pl 程序创立的变音。这时,咱们能够开端编写首要的程序逻辑了,如下所示。

清单 5. 首要程序逻辑

以下为引证的内容:

push @suggestLinks, sortResults(

directorySplitTest( $origLink ) );

push @suggestLinks, sortResults( combinedTest(

$origLink ) );

push @suggestLinks, sortResults( containsTest(

$origLink ) );

# from the book - unique-ify the array

my %seen = ();

@suggestLinks = grep{ ! $seen{$_}++ }

@suggestLinks ;

print header;

print qq{Error 404: The file requested

[$ENV{REDIRECT_URL}] is unavailable.

};

next if( @suggestLinks == 0 );

print qq{Please try one of the following pages:

};

for my $link( @suggestLinks ){

$link = substr($link,index($link,'./')+1);

print qq{$link

};

}

首要,对匹配测验各有些的输出进行排序,然后将其添加到总主张连接列表。对连接列表进行排序和专一化(unique-ifying)以后,将主张连接直接打印输出。

三个排序指令将成果保存在同一个数组中,意图是创立一个有序的主张列表。发作 404

过错时,目录树中(最少榜首级目录)极有也许会呈现目录分隔符(用于表明 Web 页面)。比如说,以 bloggs/nathenherringtoon.html

页面恳求为例。上述代码中所调用的 directorySplitTest 办法将创立一个排序的页面列表,BLKS 和子目录 N0NHRNKTN

的变音匹配都将包括在该列表中。这一战略可用于区别根目录中的文件(如 blogs.html 和

nathanharrington.html)和完好途径名匹配的页面(如 blogs/nathanharrington.html)。下面的清单显现了

directorySplitTest 子例程的内容。

清单 6. directorySplitTest subroutine

以下为引证的内容:

sub directorySplitTest

{

my @matchRes = ();

my $inLink = $_[0];

for my $fileName ( keys %mt )

{

my @inLinkMetas = ();

# process each metaphone chunk as a directory

for my $inP ( split '\/', $inLink ){ push

@inLinkMetas, Metaphone($inP) }

my @metaList = split ' ',

$mt{$fileName}{metaphones};

next if( @metaList != @inLinkMetas );

my $pos = 0;

my $totalMatch = 0;

for( @metaList )

{

$totalMatch++ if( $metaList[$pos] =~

/(\b$inLinkMetas[$pos]\b)/i );

$pos++;

}#for meatlist

# make sure there is a match in each metaphone

chunk

next if( $totalMatch != @metaList );

push @matchRes, "$mt{$fileName}{score} ##

$fileName";

}#for keys in metaphone hash

return( @matchRes );

}#directorySplitTest

组合测验坐落 directorySplitTest 以后,用于查看变音混和在一起时的匹配状况 —

疏忽任何目录构造。该测验用于纠正 404 类过错,即文件名中富含空格、斜杠、反斜杠、冒号和别的一些无发音的字符。比如说,假如关于

blogs_nathanherrington.html 宣布一个 404 恳求,那么 directorySplitTest 将回来零成果,可是

combinedTest 将发现该 404 产生的变音组合在一起是 blogs/NathanHarrington.html

页面的精确匹配。相同,这些主张的优先级低于目录匹配,因而这些分类成果将在 directorySplitTest 以后存入 suggestLinks

数组。以下清单显现了 combinedTest 子例程。

清单 7. combinedTest 子例程

以下为引证的内容:

sub combinedTest

{

my @matchRes = ();

my $inLink = $_[0];

for my $fileName ( keys %mt )

{

my $inLinkMeta = Metaphone($inLink);

# smoosh all of the keys together, removing spaces

and trailing newline

my $metaList =  $mt{$fileName}{metaphones};

$metaList =~ s/( |\n)//g;

next if( $metaList !~ /(\b$inLinkMeta\b)/i );

push @matchRes, "$mt{$fileName}{score} ##

$fileName";

}#for filename keys in metaphone hash

return(@matchRes);

}#combinedTest

在 combinedTest 以后是最终一个匹配测验,该测验依据一个广度包括查找。假如当时的 404

连接的变音是 metaphoneScores.txt 文件中可用变音的一有些,咱们将把它添加到主张列表。包括查找的规划意图是寻觅内容极度不完好的

URL。nathan.html 页面在任何方位都无法找到,可是一个良好的主张应当是 /NathanHarrington.html 和

/blogs/NathanHarrington.html,而且它们依据效果域值排序并添加到 suggestLinks 数组中。留意,此办法还将为单字母变音

404(如 whoo.html)生成 NathanHarrington.html 主张。因为 NathanHarrington.html 变音中富含一个

“H”,故将其添加到主张列表。思考创立一个最小长度的匹配变音,或供给一个包括总数受限的匹配,以修正这一做法。清单 8 显现了 containsTest 和

sortResults 子例程。

清单 8. sortResults 和 containsTest 子例程

以下为引证的内容:

sub sortResults

{

# simply procedue to sort an array of 'score ##

filename' entries

my @scored = @_;

my @idx = (); #temporary index for sorting

for my $entry( @scored ){

# create an index of scores

my $item =

 substr($entry,0,index($entry,'##'));

push @idx, $item;

}

# sort the index of scores

my @sorted = @scored[ sort { $idx[$b] <=>

$idx[$a] } 0 .. $#idx ];

return( @sorted );

}#sortResults

sub containsTest

{

my @matchRes = ();

my $inLink = $_[0];

for my $fileName ( keys %mt )

{

my $inLinkMeta = Metaphone($inLink);

my $metaList =  $mt{$fileName}{metaphones};

next if( $metaList !~ /$inLinkMeta/i );

push @matchRes, "$mt{$fileName}{score} ##

$fileName";

}#for filename keys in metaphone hash

return(@matchRes);

}#containsTest

修正 Apache httpd.conf 文件

上面所规划的 MetaphoneSuggest 脚本是一个将从 Apache 中直接调用的

cgi-bin 脚本。要运转 MetaphoneSuggestscript 脚本,咱们需求对 httpd.conf 文件进行恰当修正,否则将显现 404

过错页面。比如说,假如默许的 httpd.conf 文件富含以下有些:

清单 9. 默许 httpd.conf 有些

以下为引证的内容:

# Customizable error responses come in three

flavors:

# 1) plain text 2) local redirects 3) external

redirects

#

# Some examples:

#ErrorDocument 500 "The server made a boo

boo."

#ErrorDocument 404 /missing.html

#ErrorDocument 404

"/cgi-bin/missing_handler.pl"

#ErrorDocument 402

http://www.example.com/subscription_info.html

在注释掉的 ErrorDocument 代码行以后刺进如下代码:ErrorDocument 404

"/cgi-bin/MetaphoneSuggest"。保证 MetaphoneSuggest 和 metaphonesScore.txt 文件坐落 Web

服务器的<document_root

完毕语

记住,运用 MetaphoneSuggest 程序中所描绘的东西时,过错条件必须为 404

页面。试着供给少量主张的挑选并坚持规划的简略性。请教 Web

规划方面的知名人士,了解他们为何没有供给主动连接主张,或许开展各种可用性研讨,了解何种状况下最适合在站点中实现连接主张东西。

这篇文章供给了各种东西和代码,用于在 404

页面中创立有用的连接主张。可是,这些示例都现已实现,您能够经过它们供给一些杂乱的功用,而不仅仅是简略的目录连接或拼写主张。经过对特定站点和内容进行调整,蠢笨的

404 过错将不复存在。

优质IT资源分享社区为你提供此文。

[font=Tahoma  ]本站有大量优质php教程视频,资料等资源,包含php基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。

php教程视频

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客