我希望用HTML5和模式属性验证我的所有表单,但是一如既往,互联网上没有什么是完美的,我仍然需要备份来捕获那些不使用HTML5友好浏览器的用户。
我很难在手册中找到正则表达式的确切表示,所以如果你知道,我会感激一些帮助。我已经用两种方式编写代码,HTML方式和HTML帮助方式(见下文),HTML5在现代浏览器中工作和验证,除了预期的IE,但我不能将它们翻译成python。
一个例子,你将在下面看到,是表达式pattern="[A-F0-9]{11}|[A-F0-9]{14}"
这有效地强制输入仅包含A-F的大写字母和数字0-9。它还确保长度正好是11个字符或14.所以我如何在web2py中使用它? IS_LENGTH似乎只接受我测试的范围,到目前为止我只发现IS_ALPHANUMERIC
来控制接受哪些字符。
请参阅以下表格:
HTML:
<form id="activate_form" method="post" action="">
<label for="meid">MSIE/ESN <sup>*</sup></label>
<input name="meid" pattern="[A-Fa-f0-9]{11}|[A-Fa-f0-9]{14}" placeholder="MEID/ESN" required />
<br />
<label for="zip">Zip Code <sup>*</sup></label>
<input type="number" name="zip" pattern="{5}" placeholder="Zip Code" required />
<br />
<br />
<br /><br />
<input type="button" name="cancel" value="Cancel" onClick="history.go(-1);return true;" />
<input type="submit" name="submit" value="Activate" />
<p class="small"><sup>*</sup> denotes a required field.
</form>
HTML助手:
form=FORM(LABEL('MEID/ESN ',(SPAN('*'))),INPUT(_name='meid',_pattern="[A-F0-9]{11}|[A-F0-9]{14}",_placeholder='MEID/ESN',_required='required',_title="The MEID/ESN number only contains 11 or 13 characters, the letters A-F, and the numbers 0-9.",requires=[IS_LENGTH(11|14),IS_NOT_EMPTY()], _onblur="this.checkValidity();"),BR(),LABEL('ZIP CODE ',(SPAN('*'))),INPUT(_name='zip',_type='number',_pattern="[0-9]{5}",_placeholder='Zip Code',_required='required',_title="We only required the five character zip code.",requires=IS_NOT_EMPTY()),BR(),BR(),BR(),BR(),INPUT(_type='button',_name='cancel',_value='Cancel',_onclick="history.go(-1);return true;"),INPUT(_type='submit',_name='submit',_value='Activate'),_method='post',_id='activate_form')
if form.accepts(request,session):
response.flash = 'Form accepted'
# redirect(URL('next'))
elif form.errors:
response.flash = 'Form has errors'
return dict(form=form)
答案 0 :(得分:1)
如果您想坚持使用客户端验证,您可能还会考虑像Webshims Lib这样的Javascript polyfill库,它允许您在旧版浏览器中使用HTML5功能。另请注意,虽然客户端验证可以改善用户体验,但它不能防止恶意攻击,因此您可能还需要进行一些服务器端验证。
无论如何,对于服务器端模式验证,您可以使用IS_MATCH()
验证程序。例如:
IS_MATCH('[A-F0-9]{11}|[A-F0-9]{14}', strict=True)
这将匹配字符串的开头,设置strict=True
也需要匹配字符串的结尾(相当于在正则表达式的末尾添加“$”)。如果您不想匹配字符串的开头,而是在字符串中的任何位置搜索模式,则可以设置search=True
。
答案 1 :(得分:1)
我认为你没有看到合适的验证器。你可以在你的情况下使用IS_MATCH():
requires=IS_MATCH('^(\w{11}|\w{14})$')
查看book处的验证人列表,还有其他可能感兴趣的列表。此外,当您处理所提供的验证器都不起作用的专业字段时,实现您自己的easy非常{= 3}
web2py的源代码非常友好,我建议您在书上找不到答案时直接查看代码,这并不总是最新的。可能是他们现在更新了这本书,但我记得前一段时间我检查了验证器的来源,那里还有一些有趣的验证器尚未记录。我读了如何实现FORM帮助器,它帮助我解释了它周围的“神奇”,并使我有可能实现一些非常疯狂的东西,否则我将重新发明轮子,就像实现我自己的ajax专门与CSRF保护兼容的表格。