在URL中使用变量时验证HTML的问题

时间:2012-04-30 16:19:09

标签: php w3c-validation

通过W3C验证器运行我的页面时出现此错误:

=在未加引号的属性值中。可能的原因:一起运行的属性或不带引号的属性值中的URL查询字符串。

以下是导致此错误的代码:

$prevPage = "?main=men&category1=1&pagenum=$prevp"."&lowRowNum=$prev_page_low".
                    "&highRowNum=$prev_page_high";

print("<a class='left' href=$prevPage>".
                    "Previous Page</a>&nbsp;&nbsp;&nbsp;");

我在其他任何PHP脚本中都没有收到任何类似的错误,所以我猜这是我在做错的具体事情吗?

有人能看出为什么这段代码导致了这个错误吗?

我已经研究过这个并且读到它可能是HTML特殊字符?我不确定..

谢谢

2 个答案:

答案 0 :(得分:5)

只需尝试:

<a class='left' href='$prevPage'>

注意引号。始终尝试在HTML中引用您的属性。更好的做法是:

echo '<a class="left" href="' . $prevPage . '">' //etc etc;

尽量不要回显整个HTML字符串,因为在使用单引号和双引号时可能会感到困惑。

答案 1 :(得分:2)

我建议在这里使用printf()htmlentities()的组合:

printf(
  '<a class="left" href="%s">Previous Page</a>'
    , htmlentities($prevPage)
);

printf()在替换特殊格式的标记后需要一个字符串echo。在上面的示例中,字符串中有一个标记,表示为%s

printf()运行时,它会用相应的参数替换每个标记。在上面的示例中,%s替换为htmlentities($prevPage)的结果。

The manual page for sprintf()详细介绍了令牌的工作方式,并提供了更多示例(sprintf()printf()相同,只是sprintf()返回格式化的字符串,而{ {1}}直接输出。)

为了确保printf()等实体能够正确编码以进行标记验证,您还应该使用&