热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于正则表达式对象test()方法的问题

WriteByMonkeyfly以下内容均为原创,如需转载请注明出处。前提今天在看别人自定义的一个必填项的表单验证的方法时,发现一个问题ÿ

Write By Monkeyfly

以下内容均为原创,如需转载请注明出处。

前提

今天在看别人自定义的一个必填项的表单验证的方法时,发现一个问题:

HTML代码:

//data-empty 自定义的属性 存在的话 说明是必填项 不存在 则说明不是必填的
<input type&#61;"text" placeholder&#61;"存在data-empty属性" data-empty&#61;"请输入用户名" >
<input type&#61;"text" placeholder&#61;"没有data-empty属性" >
<input type&#61;"text" placeholder&#61;"请输入手机或电话" data-empty&#61;"请输入手机或电话" data-pattern&#61;"^((0\d{2,3}-?\d{7,8})|(1[35784]\d{9}))$" >

jQuery代码&#xff1a;

$(function(){$("input").on(&#39;blur&#39;, function(event) {//错误信息的提示内容&#xff0c;已经提前在data-empty属性中定义好了var empty &#61; $(this).attr("data-empty");//如果文本框的值为空&#xff0c;则进行弹窗提示if($(this).val() &#61;&#61;""){if(empty){//弹窗提示 data-empty 中已定义好的错误提示信息&#xff08;代码省略了&#xff09;setTimeout(function(){//1.5秒后移除该弹框提示&#xff08;代码省略了&#xff09;},1500)}else{//如果文本框的值为空&#xff0c;而且没有data-empty属性&#xff0c;说明它不是必填项&#xff0c;则不用写else语句alert("该文本框没有data-empty属性");//写else语句仅仅为了测试}}//下面的正则验证&#xff0c;仅仅用于联系方式文本框&#xff08;因为只适用于存在data-pattern属性且值不为空的情况&#xff09;var pattern &#61; new RegExp( $(this).attr(&#39;data-pattern&#39;) );var result &#61; pattern.test( $(this).val() );if( $(this).val() && !result){//弹窗提示“格式错误”&#xff0c;且1.5s后自动消失setTimeout(function(){//1.5秒后移除该弹框提示&#xff08;代码省略了&#xff09;},1500)}});
}

说明&#xff1a;

  • 其实刚开始看时&#xff0c;愣是没看明白正则验证的前3行代码&#xff0c;不知道 result的值何时为true &#xff0c;何时为false
  • 在查看了正则表达式相关知识和进行了相关的代码测试之后&#xff0c;才算是真正明白了。

分析&#xff1a;

  • 首先&#xff0c;我们要知道RegExp 对象表示正则表达式&#xff0c;它是对字符串执行模式匹配的强大工具。
  • 其次&#xff0c;我们要知道创建 RegExp 对象的语法&#xff1a;new RegExp(pattern, attributes);
  • 参数说明&#xff1a;
    • pattern&#xff1a;本意为模式&#xff0c;它是一个字符串&#xff0c;表示一种正则表达式的匹配模式&#xff0c;也可以是自定义的正则表达式。
    • attributes&#xff1a;【可选参数】本意为属性&#xff0c;是一个可选的字符串&#xff0c;包含3种属性&#xff1a;"g"、"i" 和 "m"。分别是&#xff1a;全局匹配、忽略大小写匹配和多行匹配。
    • 注&#xff1a;如果 第一个参数pattern 是正则表达式&#xff0c;而不是字符串&#xff0c;则必须省略该参数。
  • 返回值&#xff1a;一个新的 RegExp 对象&#xff0c;具有指定的模式和标志&#xff08;"g"、"i" 或 "m"&#xff09;。
  • 正则表达式对象的方法&#xff1a;
    • test()方法用于检测一个字符串是否匹配某个模式。&#xff08;模式就是创建正则表达式对象时传入的字符串参数&#xff09;
    • 语法&#xff1a;正则表达式对象.test(string)
    • 返回值&#xff1a;如果字符串 string 中含有与 正则表达式对象 匹配的文本&#xff0c;则返回 true&#xff0c;否则返回false

//1.首先看前两行代码&#xff0c;拆开来看var pattern &#61; new RegExp( $(this).attr(&#39;data-pattern&#39;) );var result &#61; pattern.test( $(this).val() );
//它可以看成是这两部分的结合&#xff0c;我们一一来判断它们值可能出现的情况。var pattern &#61; new RegExp( );//创建一个正则表达式对象//括号内需要传递一个参数&#xff0c;指的是要匹配字符串的模式&#xff0c;即自定义的字符串过滤或称验证规则。var result &#61; pattern.test( $(this).val() ); //一般是结合正则表达式对象的test方法来使用。$(this).attr(&#39;data-pattern&#39;)//获取该对象的自定义属性值

测试过程1&#xff1a;

var p &#61; new RegExp();
console.log(p); /(?:)/
p.test(""); //true
p.test("123"); //true
p.test("aae"); //true

var p &#61; new RegExp("");
console.log(p); /(?:)/
p.test(""); //true
p.test("123"); //true
p.test("asd"); //true

var p &#61; new RegExp(undefined);
console.log(p); /(?:)/
p.test(""); //true
p.test("123"); //true
p.test("1234aae"); //true

var p &#61; new RegExp("undefined");
p.test("123"); //false
p.test("asd"); //false

var p &#61; new RegExp(null);
p.test("123"); //false
p.test("asd"); //false

测试结果1&#xff1a;

  • 对于正则表达式对象p来说&#xff0c;如果创建对象时传入的字符串参数为空&#xff08;""&#xff09;&#xff0c;传入一个undefined&#xff0c;或者没传任何参数&#xff0c;此时调用它的test()方法能匹配到任何字符串&#xff0c;因此test()方法的返回值都为true。&#xff08;这相当于匹配的模式为""undefined值、或无模式&#xff09;

总结&#xff1a;pattern对象对空字符串("")undefined值、空值的处理&#xff0c;都会导致test()方法返回true

测试过程2&#xff1a;

//如果属性不存在&#xff0c;则返回undefined类型
"text" >
var empty &#61; $(this).attr("data-empty"); //empty &#61; undefined
console.log(typeof empty); //undefined

//如果属性存在&#xff08;不管是否为空&#xff09;都返回string类型
<input type&#61;"text" data-empty&#61;"" >
var empty &#61; $(this).attr("data-empty"); //empty &#61; ""
console.log(typeof empty); //string

测试结果2&#xff1a;如果自定义属性存在&#xff0c;则返回string类型&#xff0c;如果自定义属性不存在&#xff0c;则返回undefined类型。

现在&#xff0c;这个问题就迎刃而解了

//可以这么说&#xff1a;此处只适用于存在data-pattern属性且值不为空的情况var pattern &#61; new RegExp( $(this).attr(&#39;data-pattern&#39;) );var result &#61; pattern.test( $(this).val() );//如果不存在data-pattern属性&#xff0c;result只会返回true。//要进行正则验证&#xff0c;输入框内肯定有值&#xff0c;所以 $(this).val() &#61;&#61; true//!result 恒为 false//true && false &#61;&#61; false //所以&#xff0c;只要不存在该属性&#xff0c;if语句是不会执行的if( $(this).val() && !result){//code...}


推荐阅读
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • 一、什么是闭包?有什么作用什么是闭包闭包是定义在一个函数内部的函数,它可以访问父级函数的内部变量。当一个闭包被创建时,会关联一个作用域—— ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了解决IE678伪类不兼容问题的方法,包括少用CSS3和HTML5独有的属性,使用CSS hacker,使用last-child清除浮动、批量添加标签、去掉list item最后一个的border-right等技巧。同时还介绍了使用after清除浮动时加上IE独有属性zoom:1的处理方法。另外,本文还提到可以使用jQuery代替批量添加标签的功能,以及使用负边距和CSS2选择器element+element去掉list item最后一个的border-right的方法。 ... [详细]
  • 本文介绍了在满足特定条件时如何在输入字段中使用默认值的方法和相应的代码。当输入字段填充100或更多的金额时,使用50作为默认值;当输入字段填充有-20或更多(负数)时,使用-10作为默认值。文章还提供了相关的JavaScript和Jquery代码,用于动态地根据条件使用默认值。 ... [详细]
  • 本文介绍了如何在Jquery中通过元素的样式值获取元素,并将其赋值给一个变量。提供了5种解决方案供参考。 ... [详细]
  • 本文介绍了使用FormData对象上传文件同时附带其他参数的方法。通过创建一个表单,将文件和参数添加到FormData对象中,然后使用ajax发送POST请求进行文件上传。在发送请求时,需要设置processData为false,告诉jquery不要处理发送的数据;同时设置contentType为false,告诉jquery不要设置content-Type请求头。 ... [详细]
  • 本文介绍了使用jQuery实现图片预加载和等比例缩放的方法,同时提供了演示和相关代码。该方法可以重置图片的宽度和高度,并使图片在水平和垂直方向上居中显示。 ... [详细]
  • 本文介绍了DataTables插件的官方网站以及其基本特点和使用方法,包括分页处理、数据过滤、数据排序、数据类型检测、列宽度自动适应、CSS定制样式、隐藏列等功能。同时还介绍了其易用性、可扩展性和灵活性,以及国际化和动态创建表格的功能。此外,还提供了参数初始化和延迟加载的示例代码。 ... [详细]
author-avatar
寻找初心
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有