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都有.)
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改为使用).
虽然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服务器.