JS表单验证(用正则表达式,用字符串验证)

本文详细介绍了如何使用JavaScript和正则表达式进行表单验证,包括用户输入的格式检查、字符串方法的应用及验证规则的设定,确保数据合法性,减轻服务器负担。

JS表单验证

JS运行在客户端的代码,通过在客户端对表单进行格式的验证可以避免大量不合法的数据提交到服务器,这样就可以减轻服务器端的压力。

表单的验证可以使用正则表达式进行验证

正则表达式对象的创建分为两种方法
1 . var regobj = /表达式内容/;
2. var regobj = new RegExp(“表达式内容”);

一般使用第一种方法创建

正则表达式的内容可以是简单的也可以是复合的
简单内容直接就是一个字符串: var regobj = /^xiaoli$/;

最简单的一个验证方法:

<script language="JavaScript">
			function checkName(){
				//定义验证规则
				var namereg = /^xiaoli$/;
				//namereg = new RegExp();
				//获取表单上某一个空间的值存在两种方法: 1: getElementById()的方法获取,需要为控件指定一个ID值
				//通过document.表单名.控件名.value的方法获取,需要为form标签提供name属性,需要为控件提供name属性
				//获取用户输入的用户名信息
				//var namestr = document.getElementById("txtName").value;
				//通过表单的名称获取控件的值
				var namestr = document.regForm.txtName.value;
				//验证处理  利用正则表达式对象的 test 方法去验证目标字符串是否符合验证的规则,返回值为boolean
				if(namereg.test(namestr)){
					alert("验证成功");
					return true;
				}else{
					alert("验证失败");
					return false;
				} 
			}
		</script>
	</head>
	<body>
		<form action="index.html" method="post" name="regForm" onsubmit="return checkName()">
			用户名:<input type="text" name="txtName" id="txtName" /><br/>
			<input type="submit" value="提交" />
		</form>
	</body>

注意的点:
一:获取表单上某一个空间的值存在两种方法: 1: document.getElementById()的方法获取,需要为控件指定一个ID值
通过document.表单名.控件名.value的方法获取,需要为form标签提供name属性,需要为控件提供name属性
二:如果进行表单验证,验证方法必须要返回一个boolean类型的结果
三:调用验证的验证的方法,是在form表单的onsubmit事件中调用,且调用的时候必须添加return <form οnsubmit=”return checkFomr()”>
四:如果使用正则表达式验证,一般需要设定头和尾的结束表示 var regname=/^验证规则$/
^表示以什么开头, $表示以什么结尾.
五:验证的时候需要使用的是正则表达式的test 方法获取验证的结果

正则表达式通过内容需要添加一些通配符实现规则验证

^ 必须以表达式开始
$必须以表达式结束
//正则表达式通配符的标识
//\s 单个空白字符
//\S 单个非空白字符
//\d 单个数字
//\D 单个非数字
//\w 单个字符(数字,字母,下划线)
//\W 非单个字符(除去数字,字母,下划线)
//[a,b,c,1-9] 单个a,b,c和1到9中任意字符
//次数
//{n} 固定n次
//{n,} 最少n次
//{n,m} 最少n次最多m次
//{,m} 最多m次
//+ 最少1次最多不限制,等同于{1,}
//? 0次或1次 ,等同于{0,1}
//* 0次或多次 ,等同于{0,}

利用正则表达式实现表单的验证

//用户名只能有数组字母下划线组成,长度4-6位
			function checkName(){
				//定义验证规则
				var namereg=/^\w{4,6}$/;
			 	//获取验证内容
			 	var namestr=document.regForm.txtName.value;
			 	//实现验证
			 	if(!namereg.test(namestr)){
			 		document.getElementById("namespan").innerHTML="用户名只能是数字字母下划线组成,长度4-6位";
			 		document.getElementById("namespan").className="info_error";
			 		return false;
			 	}
			 	document.getElementById("namespan").innerHTML="验证成功";
			 	document.getElementById("namespan").className="info_success";			 	
			 	return true;
			}
			//用户年龄必须是数字最多两位
			function checkAge(){
				//定义验证规则
				var agereg=/^\d{2}$/;
			 	//获取验证内容
			 	var agestr=document.regForm.txtAge.value;
			 	//实现验证
			 	if(!agereg.test(agestr)){
			 		document.getElementById("agespan").innerHTML="用户的年龄必须是两位数";
			 		document.getElementById("agespan").className="info_error";
			 		return false;
			 	}
			 	document.getElementById("agespan").innerHTML="验证成功";
			 	document.getElementById("agespan").className="info_success";			 	
			 	return true;
			}
			function checkForm(){
				if(checkName() && checkAge())
				{
					return true;
				}
				return false;
			}
	</script>

样式表效果

	<style type="text/css">
			.info_success{ background-color: #7FFF00; color: green;}
			.info_error{ color: red; background-color: #808080;}
			
		</style>

页面效果

<form action="index.html" method="post" name="regForm" onsubmit="return checkForm()">
			用户名:<input type="text" name="txtName" id="txtName" /><span id="namespan"></span> <br/>
			用户年龄:<input type="text" name="txtAge" id="txtAge" /><span id="agespan"></span> <br/>
			<input type="submit" value="提交" />
		</form>

表单的验证需要在表单的onSubmit 中添加方法,如果验证的方法返回为false则表单不提交,如果返回值为true 则表单提交

<form action="head.html" method="get" name="registerForm" 
onsubmit="return checkForm()">

正则表达式的简单用法

		//只能出现字母,一次到多次
				var namereg = /^[a-z,A-Z]+$/;
				//定义AGE的正则表达式(年龄必须在10-29之间)
				var ageReg = /^[1,2]\d$/;
				//密码必须是数字字母下划线,数字不能开头,长度6-8位
				var passReg = /^[a-z,A-Z,_]\w{5,7}$/;
				//定义正则表达式对象(汉字的范围是\u4e00-\u9fa5)4-6个汉字
				var realnameReg = /^[\u4e00-\u9fa5]{4,6}$/;
				//邮箱的验证规则
				var emailReg = /^\w+@\w+(\.[a-z,A-Z]{2,3}){1,2}$/;

实际使用(利用表单控件的onBlur事件调用验证的方法)

真实姓名:
<input type="text" name="urealname" onblur="checkRealName()" />
<span id="errorRealname">2-4位汉字</span><br/>

	function checkRealName() {
				//定义正则表达式对象(汉字的范围是\u4e00-\u9fa5)
				var realnameReg = /^[\u4e00-\u9fa5]{4,6}$/;
				//获取密码对象
				var realnameStr = document.registerForm.urealname.value;
				//验证
				if(realnameReg.test(realnameStr)) {
					document.getElementById("errorRealname").className = "span_success";
					document.getElementById("errorRealname").innerHTML = "成功";
					return true;
				}
				document.getElementById("errorRealname").className = "span_error";
				document.getElementById("errorRealname").innerHTML = "真实姓名必须4-6位汉字";
				return false;
			}

使用字符串的方法实现表单的验证

在javaScript中字符串的方法和JAVA中字符串的方法基本一致
Length 属性获取字符串的长度
CharAt() 获取指定位置的单个字符
indexOf() 判断某一个子字符串出现的位置
subString 从字符串中截取子字符串

利用字符串的方法实现密码的验证
(密码必须包含数字字母下划线,数字不能开头,必须6-8位)

请输入密码:
<input type="text" name="upass" onblur="checkPass()" />
<span id="errorPass">密码必须包含数字字母下划线,数字不能开头,必须6-8位</span><br/>

			function checkPass(){
				//密码必须包含数字字母下划线,数字不能开头,必须6-8位
				var passstr = document.registerForm.upass.value;
				//长度必须6-8为
				if(!(passstr.length >=6 && passstr.length<=8))
				{
					document.getElementById("errorPass").innerHTML="长度必须6-8位";
					document.getElementById("errorPass").className="span_error";
					return false;
				}
				//数字不能开头
				if(passstr.charAt(0)>='0' && passstr.charAt(0)<='9')
				{
					document.getElementById("errorPass").innerHTML="数字不能开头";
					document.getElementById("errorPass").className="span_error";
					return false;
				}
				//是否包含了非法字符
				for(var i =0;i<passstr.length;i++){
					var char_temp = passstr.charAt(i);
					if(!(char_temp>='A' && char_temp<='Z' || char_temp=='_' ||passstr.charAt(i)>='0' && passstr.charAt(i)<='9'
					||char_temp>='a' && char_temp<='z' )){
								document.getElementById("errorPass").innerHTML="不能包含非法字符";
						document.getElementById("errorPass").className="span_error";
						return false;
					}
				}
				//验证是否包含所有的(数字,字母,下划线)
				var count  = 0;
				var numReg = /\d/;
				if (numReg.test(passstr)){
					count++;
				}
				var charReg = /[a-z,A-Z]/;
				if(charReg.test(passstr)){
					count++;
				}
				var xiaReg = /[_]/;
				if(xiaReg.test(passstr)){
					count++;
				} 
				if(count!=3){
						document.getElementById("errorPass").innerHTML="密码中必须包含三种字符";
						document.getElementById("errorPass").className="span_error";
						return false;
				}
				document.getElementById("errorPass").innerHTML="密码成功";
				document.getElementById("errorPass").className="span_success";
				return true;
			}

<think>首先,用户的问题是:在使用Vue和JavaScript进行表单验证时,通过pattern属性使用正则表达式,但因为正则中包含“/”字符而报错。用户希望找到解决办法。 关键点: - 问题:正则表达式中的“/”字符导致报错。 - 环境:Vue.js,使用pattern属性进行表单验证。 在Vue中,表单验证通常使用Element UI或其他库的验证规则,其中pattern属性用于正则表达式验证。但正则表达式通常以斜杠“/”开头和结尾,例如/pattern/。在JavaScript对象中,直接使用这样的正则表达式可能没问题,但用户提到报错,可能是因为在字符串中使用了它。 从引用中看: - 引用[1]:展示了正则表达式在pattern属性中的使用:{pattern: /^((?!select|update|delete|exec|count|'|"|=|;|>|<|%).)*/gi, message: “禁止输入特殊字符或者SQL关键字!”, trigger: “blur”} - 引用[3]:类似,{pattern: /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z][A-Z][A-Z0-9]{4}[A-Z0-9挂学警港澳]$/, message: '请输入正确的车牌号', trigger: 'blur' } - 引用[4]:提到正则表达式表单验证中的应用。 所以,在Vue的验证规则中,pattern属性应该是一个正则表达式对象,而不是字符串。用户可能错误地将其写成字符串,导致“/”字符被解释为字符串的一部分,从而报错。 常见错误: - 如果用户写成字符串,如pattern: "/regex/",那么“/”会被视为字符串的字符,而不是正则分隔符。这会导致错误,因为pattern期望一个正则表达式对象。 - 在JavaScript中,正则表达式应该直接使用/.../语法,或使用new RegExp()构造函数。 解决办法: 1. **使用正则表达式字面量**:在pattern属性中直接使用正则表达式字面量,如/pattern/,而不是字符串。 2. **如果必须使用字符串,使用RegExp对象**:如果正则中包含“/”字符,并且需要转义,可以使用new RegExp()来创建正则表达式。 用户提到“因包含‘/’字符而报错”,所以问题可能是正则表达式中本身有“/”字符,比如在匹配URL或路径时。例如,正则如/^https:\/\/example.com/,其中“/”需要转义为\/。 在正则表达式字面量中,斜杠“/”需要转义为\/,以避免被解释为分隔符的结束。例如,要匹配一个包含“/”的字符串,正则应该写成/abc\/def/。 在Vue的pattern属性中: - 如果直接使用正则字面量,如pattern: /abc\/def/,这是正确的。 - 如果写成字符串,如pattern: "abc/def",这会导致错误,因为pattern期望一个RegExp对象。 所以,用户可能错误地将正则写成了字符串。 基于引用: - 引用[1], [3] 都展示了使用正则字面量,如/.../。 - 引用[2] 提到了表单验证的方法,但没有具体说正则。 因此,解决办法是确保pattern属性是一个正则表达式对象,而不是字符串。并正确处理正则中的“/”字符。 步骤解决: 1. **检查pattern属性的写法**:在Vue验证规则中,pattern应该直接是正则表达式,如 { pattern: /your-regex/, ... } 2. **转义正则中的“/”字符**:如果正则中需要匹配“/”字符,在正则字面量中写成\/。 3. **使用RegExp构造函数**:如果正则很复杂或需要动态构建,使用new RegExp(),传入字符串,并注意转义。 例如: - 错误写法:pattern: "/abc/def/" // 这是字符串,不是正则 - 正确写法:pattern: /abc\/def/ 或 pattern: new RegExp("abc/def") 在Vue的验证规则中: ```javascript rules: { myField: [ { pattern: /https?:\/\/.+\..+/, message: 'Invalid URL' } // 正确 // 或 { pattern: new RegExp("https?://.+\\..+"), message: 'Invalid URL' } // 使用双反斜杠转义 ] } ``` 在new RegExp中,字符串中的反斜杠需要转义,所以写成"abc\\/def"。 回答结构: - 解释问题原因。 - 提供解决办法。 - 给出示例代码。 - 生成相关问题。 最后,添加引用标识,如[^1],但引用是给定的,我需要参考它们。引用[1],[3] 直接相关。 相关问题: 1. 如何在Vue中处理表单验证中的特殊字符转义? 2. Vue表单验证正则表达式的常见错误有哪些? 3. 如何动态生成表单验证规则? 确保回答真实可靠,基于Vue和JavaScript知识。</think>### Vue.js 表单验证正则表达式包含“/”字符报错的解决方法 在使用 Vue.js 进行表单验证时,通过 `pattern` 属性使用正则表达式是常见做法。但当正则表达式中包含“/”字符(例如匹配 URL、路径或日期时),可能导致语法错误。问题根源在于: - **错误写法**:如果将正则表达式写成字符串(如 `"/pattern/"`),其中的“/”会被视为字符串的一部分而非正则分隔符,导致解析失败。 - **正确写法**:`pattern` 属性应直接接收正则表达式对象(如 `/pattern/`),并在正则内部对“/”进行转义。 以下是详细解决方法和示例: --- ### 解决方法及步骤 1. **使用正则表达式字面量而非字符串** 在 Vue 验证规则中,直接使用 `/.../` 语法定义正则表达式,避免使用引号包裹。 - **错误示例**(报错原因): ```javascript pattern: "/https://example.com/" // 错误:字符串中的 "/" 导致解析冲突 ``` - **正确示例**: ```javascript pattern: /https:\/\/example\.com/ // 正确:使用字面量,并对 "/" 转义为 \/ ``` 2. **转义正则中的特殊字符** - 若正则需匹配“/”字符,必须使用 `\/` 转义(例如匹配 URL 中的 `//`)。 - 其他需转义字符:`.` → `\.`、`?` → `\?` 等。 3. **动态正则使用 `RegExp` 构造函数** 若正则需动态生成(如拼接变量),使用 `new RegExp()` 并正确转义字符串: ```javascript const domain = "example.com"; pattern: new RegExp("https:\\/\\/" + domain.replace(".", "\\.")) // 双反斜杠转义 ``` 4. **完整 Vue 表单验证示例** 以 Element UI 为例,验证规则中正确应用正则: ```javascript export default { data() { return { rules: { urlField: [ { required: true, message: '请输入URL', trigger: 'blur' }, { pattern: /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/, // 正确转义所有 "/" message: 'URL格式错误(如:https://example.com/)', trigger: 'blur' } ] } }; }, methods: { submitForm() { this.$refs.form.validate(valid => { if (valid) alert("验证成功"); }); } } }; ``` > **关键点**:正则 `/^(https?:\/\/)?.../` 中: > - `https?` 匹配 "http" 或 "https"。 > - `:\/\/` 转义匹配 "://"。 > - 结尾 `\/?` 匹配可选的尾部斜杠。 --- ### 常见错误场景及修复 - **场景1:匹配日期(如 `YYYY/MM/DD`)** - 错误:`pattern: "/\d{4}/\d{2}/\d{2}/"`(字符串报错)。 - 修复:`pattern: /\d{4}\/\d{2}\/\d{2}/`(转义为 `\/`)。 - **场景2:防止 SQL 注入(引用[1]案例)** - 原正则含特殊字符,但正确写法无需字符串包裹: ```javascript { pattern: /^((?!select|update|delete|exec|count|'|"|=|;|>|<|%).)*/gi, message: "禁止输入特殊字符或SQL关键字" } ``` - **场景3:车牌号验证(引用[3]案例)** - 正确使用字面量: ```javascript pattern: /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z][A-Z][A-Z0-9]{4}[A-Z0-9挂学警港澳]$/ ``` --- ### 注意事项 1. **测试正则表达式**: 使用在线工具(如 [RegExr](https://regexr.com/))测试正则逻辑,确保转义正确。 2. **避免多余引号**: `pattern` 的值必须是正则对象,而非字符串(如 `"/\d+/"` 是错误写法)。 3. **兼容性**: 在 Vue 2/3 和主流 UI 库(Element UI、Vuetify)中均适用此方法。 > 引用[1] 和 引用[3] 展示了正确使用正则字面量的表单验证示例[^1][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值