PHP匹配变音使404页面更加智能化
清单 2. buildMetaphoneList.pl
| 以下为引用的内容: #!/usr/bin/perl -w # buildMetaphoneList.pl - / split filename, 0 score, metaphones use strict; find(\&htmlOnly,"."); sub htmlOnly my @slParts = split '/', $clipFname; print "$File::Find::name ### 0 ### "; }#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 / open(MPH,'metaphonesScore.txt') or die "can't open metaphones"; |
代码首先引入了一些常用库并声明了一些变量,然后将加载 404 报告文本和通过 buildMetaphoneList.pl 程序创建的变音。这时,我们可以开始编写主要的程序逻辑了,如下所示。




