输入标记内的HTML Name属性允许使用哪些字符?

DLH*_*DLH 77 html forms web-standards html-input

我有一个<input>动态生成s 的PHP脚本,所以我想知道是否需要过滤name属性中的任何字符.

我知道这个名字必须以一封信开头,但我不知道其他任何规则.我想方括号必须允许,因为PHP使用这些来从表单数据创建数组.括号怎么样?空间?

小智 50

请注意,并非所有字符都是为name表单字段的属性提交的(即使使用POST)!

修剪了空格字符,并且内部空白字符以及字符.被替换为_.(在Chrome 23,Firefox 13和Internet Explorer 9中测试过,所有Win7都有.)

  • 感谢您添加此通知,朋友.我正要开始使用编码.作为分隔符. (10认同)
  • 我想要指出,这是一个特定于服务器的东西,而不是浏览器的东西.在Win7 FF3/3.5/31,IE5/7/8/9/10/Edge,Chrome39和Safari Windows 5上进行测试,所有这些都在POST中发送了"test this.stuff"(四个前导空格)作为名称与VS2012捆绑在一起的ASP.NET dev服务器. (4认同)
  • 根据此页面,内部空白被加号(+)替换:http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_form_submit (2认同)
  • 我第二次@Dave。对于那些有同样想法的人,您可能正在寻找数组样式的输入:`first[second]` 而不是 `first.second`。 (2认同)
  • 请参阅下面的@ Aleksander的评论.有些_servers_可能会转换'.' 到'_',但它不会在浏览器上发生. (2认同)

bob*_*nce 38

您可以在[X] HTML文件中包含的任何字符都可以放入<input name>.正如Allain的评论所说,<input name>被定义为包含CDATA,因此您不能放入的唯一内容是基础标准(SGML或XML)不允许的控制代码和无效代码点.

Allain引用了HTML4规范中的W3:

注意."get"方法将表单数据集值限制为ASCII字符.仅指定"post"方法(使用enctype ="multipart/form-data")来覆盖整个ISO10646字符集.

然而,这在实践中并非如此.

理论上,application/x-www-form-urlencoded数据没有为表单的名称或值指定编码的机制,因此在任何一个中使用非ASCII字符"未指定"为工作,您应该使用POSTed multipart/form-data.

不幸的是,在现实世界中,没有浏览器在multipart/form-dataPOST请求主体的子部分头中指定字段的编码,即使理论上也可以.(我相信Mozilla试图实现它一次,但在它破坏了服务器时退出了.)

并且没有浏览器实现令人惊讶的复杂和丑陋的RFC2231标准,这是将编码的非ASCII字段名称插入到multipart的子部分标题中所必需的.在任何情况下,定义的HTML规范multipart/form-data并不直接说应该使用RFC2231,而且,如果你尝试过,它会破坏服务器.

因此,情况的实际情况是,无论表单提交的名称和值是什么类型,都无法知道编码用于表示名称和值.对于GET和两种类型的POST表单,哪些浏览器对字段名称和包含非ASCII字符的值的处理方式相同:它使用包含所用表单的页面的编码对它们进行编码.非ASCII GET表单名称不比其他所有名称都要破碎.

DLH:

因此,name与其他元素的数据类型不同?

实际上唯一name不属性的元素CDATA是<meta>.有关所有不同用途,请参阅HTML4规范的属性列表name ; 它是一个重载的属性名称,在不同的元素上有许多不同的含义.这通常被认为是一件坏事.

但是,通常这些天你会避免name除了表单字段(它是控件名称)和param(它是一个特定于插件的参数标识符).这只是要解决的两个含义.应该避免旧学校name用于识别页面上<form>或<a>页面上的元素(id改为使用).


All*_*nde 28

对表单控件名称中出现的字符的唯一真正限制是使用GET提交表单时

""get"方法将表单数据集值限制为ASCII字符." 参考

有一个关于它良好的线程在这里.

  • 是的.刚刚在`name`属性中尝试了一个带有各种废话的`<input>`,并在HTML 4.01 Strict中验证了它.公认! (4认同)
  • “表单控件名称中可以出现哪些字符的唯一真正限制是使用 GET 提交表单时”- 不。这并不限制名称中可以出现的内容,只是意味着它必须在转换时进行 URL 编码到一个网址。 (2认同)

Ale*_*nek 7

虽然Allain的评论确实回答了OP的直接问题,并且bobince提供了一些精彩的深入信息,但我相信很多人来到这里寻求更具体问题的答案:"我可以在表单的输入名称属性中使用点字符吗?"

当我搜索这些知识时,这个帖子出现了第一个结果,我想我也可以分享我发现的东西.

首先,马蒂亚斯声称:

性格.被_取代

这是不真实的.我不知道浏览器是否真的在2013年做过这种操作 - 不过,我对此表示怀疑.浏览器按原样发送点字符(谈论POST数据)!你可以在任何像样的浏览器的开发者工具中检查它.

请注意abluejelly的一点点评论,很多人可能会错过这个评论:

我想要指出,这是一个特定于服务器的东西,而不是浏览器的东西.在Win7 FF3/3.5/31,IE5/7/8/9/10/Edge,Chrome39和Safari Windows 5上进行测试,所有这些都在POST中发送了"test this.stuff"(四个前导空格)作为名称与VS2012捆绑在一起的ASP.NET dev服务器.

我用Apache HTTP服务器(v2.4.25)检查了它,确实输入的名称如"foo.bar"更改为"foo_bar".但是像"foo [foo.bar]"这样的名字,这个点不会被_取代!

我的结论是:您可以使用点,但我不会使用它,因为这可能会导致一些意外行为,具体取决于所使用的HTTP服务器.