1

我希望使用 HTML5 和模式属性验证我的所有表单,但与往常一样,互联网上没有什么是完美的,我仍然需要备份来捕捉那些不使用 HTML5 友好浏览器的用户。

我很难在手册中找到正则表达式的确切表示,所以如果你知道,我会很感激一些帮助。我以两种方式编写了代码,HTML 方式和 HTML 帮助程序方式(见下文),HTML5 可以在除 IE 之外的现代浏览器中正常工作和验证,但我无法将它们转换为 python。

您将在下面看到一个示例,表达式pattern="[A-F0-9]{11}|[A-F0-9]{14}" 这有效地强制输入仅包含大写字母 AF 和数字 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)
4

1 回答 1

1

如果您想坚持使用客户端验证,您还可以考虑使用 Javascript polyfill 库,例如Webshims Lib,它可以让您在旧版浏览器中使用 HTML5 功能。另请注意,尽管客户端验证改善了用户体验,但它并不能防止恶意攻击,因此您可能还需要一些服务器端验证。

无论如何,对于服务器端模式验证,您可以使用IS_MATCH()验证器。例如:

IS_MATCH('[A-F0-9]{11}|[A-F0-9]{14}', strict=True)

那将从字符串的开头匹配,设置strict=True也需要匹配字符串的结尾(相当于在正则表达式的末尾添加“$”)。如果您不想匹配字符串的开头,而是在字符串中的任何位置搜索模式,您可以设置search=True.

于 2012-04-11T22:55:49.400 回答