果洛皆料电子有限公司

用Perl驗(yàn)證HTML代碼

  • 發(fā)布于:2020-05-23
  • 254 人圍觀

在Perl中編碼時(shí),代碼中的錯(cuò)誤相當(dāng)明顯——解析器會(huì)將所有錯(cuò)誤信息都顯示在屏幕上,向你警告出現(xiàn)的問(wèn)題,并讓你立即采取措施進(jìn)行更正。如果你在開(kāi)發(fā)HTML頁(yè)面,就不存在這樣的早期警告系統(tǒng)——標(biāo)記中出現(xiàn)的任何錯(cuò)誤都被瀏覽器所忽略。更糟糕的是,一些瀏覽器甚至試圖“自動(dòng)”更正常見(jiàn)的標(biāo)記錯(cuò)誤,給這個(gè)過(guò)程帶來(lái)許多新問(wèn)題。

最簡(jiǎn)單的解決方案是在應(yīng)用HTML之前對(duì)它進(jìn)行檢測(cè)(或“驗(yàn)證”)。這時(shí)就要用到一個(gè)稱為HTML::Lint的有用CPAN模塊。這個(gè)Perl模塊建立在人們所熟知的HTML::Parser模塊之上,旨在對(duì)標(biāo)記進(jìn)行檢驗(yàn),看其是否符合W3C標(biāo)準(zhǔn),并指出可能使它“中斷”或在客戶瀏覽器中無(wú)法編譯的錯(cuò)誤。

本文探討了HTML::Lint的一些功能,用它來(lái)檢驗(yàn)HTML頁(yè)面并顯示發(fā)現(xiàn)的錯(cuò)誤。首先,在Perl提示符下運(yùn)行下列命令,下載并安裝此模塊(如果你還沒(méi)有這個(gè)模塊的話)。

perl> perl -MCPAN -e "install HTML::Lint"

Linting Files

安裝模塊后,建立并保存下面的HTML文件(保存為abc.html):

<html>

<head></head>

A is for apple, B is for baby

</body>

</html>

如你所見(jiàn),此文件中有一個(gè)有意的錯(cuò)誤——開(kāi)頭缺少<body>標(biāo)簽。這個(gè)錯(cuò)誤在這里相當(dāng)明顯;但如果文件更大更復(fù)雜的話,就更難發(fā)覺(jué)缺少這樣的標(biāo)簽。這就是為什么下一步要編寫一些Perl代碼,用HTML::Lint來(lái)探測(cè)這個(gè)錯(cuò)誤。

建立并保存下列的腳本(保存為linter.pl):

#!/usr/bin/perl

# initialize linter

use HTML::Lint;

$lint = HTML::Lint->new();

# parse file

$lint->parse_file("abc.html") or die("Cannot find file!");

# check for errors

($lint->err) ? print "Your code stinks!" : print "Your code rocks!";

這個(gè)過(guò)程相當(dāng)簡(jiǎn)單:這段腳本初始化一個(gè)HTML::Lint對(duì)象,然后應(yīng)用對(duì)象的parse_file()方法來(lái)解析前面建立的HTML文件。檢測(cè)到的錯(cuò)誤(如果存在的話)被存儲(chǔ)在@err數(shù)組中,并向控制臺(tái)顯示一個(gè)錯(cuò)誤信息。

以下是你看到的輸出結(jié)果:

shell> ./linter.plYour code stinks!

當(dāng)然,如果你有大量的文件要進(jìn)行驗(yàn)證的話,這段代碼就有點(diǎn)不切實(shí)際。在那種情況下,你可能想在運(yùn)行時(shí)向腳本提交HTML文件名及路徑,而不是把它硬編碼到腳本中。列表A是前面腳本的修訂版,正好可完成這一工作。

列表A

#!/usr/bin/perl

# read file name from command line

if (!$ARGV[0]) { die ("ERROR: No file name provided"); }

# initialize linter

use HTML::Lint;

$lint = HTML::Lint->new();

# parse file

$lint->parse_file($ARGV[0]) or die("ERROR: Cannot find file");

# check for errors

($lint->err) ? print "Your code stinks! " : print "Your code rocks! ";

# print error count

print "Errors found: ", scalar($lint->err);

在這種情況下,腳本認(rèn)為一個(gè)文件路徑是它的第一個(gè)引數(shù),并將其保存在特殊的Perl @ARGV數(shù)組中。然后,腳本尋找這個(gè)文件,將它解析,并根據(jù)發(fā)現(xiàn)錯(cuò)誤與否顯示一條信息。腳本的最后一行是新的:它根據(jù)HTML::Lint@err錯(cuò)誤數(shù)組的大小,顯示由解析器發(fā)現(xiàn)的錯(cuò)誤數(shù)目。

萬(wàn)企互聯(lián)
標(biāo)簽: