你知道一个 HTML-Snippet 验证器吗?

40
我正在寻找一款工具,可以检查特定HTML片段在其正确上下文中是否有效。我需要输入类似以下的内容:
<dd>
    my definition 
    <div>
        div inside &lt;dd&gt; is allowed
    </div>
</dd>

而不是整个文档。普通的验证器会抱怨缺少dl标签,但大多数情况下我只想知道某个元素是否在另一个元素内有效。


我将尝试更详细地解释一下。考虑以下代码片段:

<form>
    <label>Name: <input /></label>
</form>

这个语句本身是正确的,但是我有两个选项来进行检验:

  1. 验证整篇文档:大多数情况下这已经足够了,但在处理局部HTML片段或嵌入式HTML时,有时候会比较麻烦。我需要将整个内容复制到一个新的HTML文档中去并进行验证。
  2. 只需复制代码片段,并使用W3C验证器进行验证,忽略一些错误。

基本上,我想检查一个元素是否仅包含它允许包含的元素。


这段代码片段之所以无效,完全是因为缺少了 <dl> 标签。在 <dd> 中包含一个 <div> 是可以的。 - BoltClock
我不确定,但你可以尝试使用Netbeans IDE,在Netbeans编辑器中粘贴HTML片段将会突出显示HTML片段中的错误和警告。 - vicky
对于Emacs用户:http://www.emacswiki.org/emacs/HtmlCheckFrag 检查非空HTML标签的匹配对。错误会被突出显示。如果文档中有错误,则在模式行中指示。在模式行中的指示器上按S-Mouse-1可搜索下一个错误。这也适用于HTML片段。尚未检查是否存在诸如<td></td>是否在<table></table>内等内容。 - Tobias
2个回答

46

你实际上可以使用W3C验证器来检查代码片段。

选择“通过直接输入验证”选项卡,然后选择“更多选项”。在那里,有一个单选按钮,“验证HTML片段”。http://validator.w3.org/#validate_by_input+with_options

它会将您的页面包装成有效的HTML,因此您看到的错误仅与代码片段有关。


3
目前未启用HTML片段验证功能。 - Suat Atan PhD

0

目前(2020年5月)W3C有一个碎片验证器,但似乎已经过时了(至少没有HTML5)。这里提供了几个简单的脚本,将标头和页脚附加到您的碎片中,并通过本地副本Nu checker运行结果。该片段可以是任何在<body>标签顶部有效的内容 - 如果需要其他内容,请修改标题和页脚。

validate1.sh 接受一个文件名参数并进行检查,而 validate2.sh 会循环处理目录中的所有HTML文件。它具有一个简单的排除列表机制,您需要进行更改。您需要修改两者以指向您的 vnu.jar 副本。

validate1.sh:

#!/bin/bash
#
# validate1.sh
#
# Run the nu validator on the HTML fragment in the supplied filename.
# This script adds a header and trailer around the fragment, and supplies
# the result to 'vnu.jar'. You'll need to modify it to correctly locate
# vnu.jar.

if test "$#" -ne 1; then
    echo "Usage: '$0 fname', where 'fname' is the HTML file to be linted"
    exit 1
fi

var="<!doctype html>
     <html lang=\"en\">
     <head>
     <title>foo</title>
     </head>
     <body>
     $(< "$1")
     </body>
     </html>"
echo "Checking '$1'... subtract 6 from any reported line numbers"
echo "$var" | java -jar vnu.jar -

validate2.sh:

#!/bin/bash
#
# validate2.sh
#
# Run the nu validator on the HTML fragments in the supplied directory.  This
# script adds a header and footer around each fragment in the directory, and
# supplies the result to 'vnu.jar'. You'll need to modify it to correctly
# locate vnu.jar.

if test "$#" -ne 1; then
    echo "Usage: '$0 fname', where 'fname' is the HTML directory to be linted"
    exit 1
fi

for filename in $1/*.html; do
    case $filename in
        # simple exclusion list example:
        "$1/root.html" | "$1/sitedown.html")
            echo "Skipping '$filename'"
            continue
            ;;
        *)
            ;;
    esac

    var="<!doctype html>
         <html lang=\"en\">
         <head>
         <title>foo</title>
         </head>
         <body>
         $(< "$filename")
         </body>
         </html>"
    echo "Checking '$filename'... subtract 6 from any reported line numbers"
    echo "$var" | java -jar vnu.jar -
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接