通过正则来控制input只能输入中英文某类字符

博客基于react + antd,目标是通过正则控制input只能输入某类字符。定义过滤方法,以只允许输入中英文为例,实现了react中input值的双向绑定。同时指出输入连续中文的问题及解决办法,还提到是否允许输入空格需结合产品需求。

背景:react + antd
目标:通过正则来控制input只能输入某类字符:

	state={
		name:""
	}
	handleNameChange = v => {
        this.setState({ name: v.target.value });//*1:input的value发生改变时,将state中的name设置为改变后的值
    };
  1. 定义一个过滤方法,以只允许输入中英文为例:
	filterName = (value = "") => {
	    return value.trim().replace(/[^a-zA-Z\u4e00-\u9fa5]/g,"");
	};
  1. 在input元素中控制value:
	<Input
	 maxLength={10} //长度限制可以通过maxLength属性简单的实现
	 placeholder="请输入"
	 value={this.filterName(this.state.name).trim()}//*2 将value指定为state中的name
	
	 onChange={this.handleNameChange}
	/>

题外话:通过* 1 和 * 2 ,就实现了react中 input 值 的双向绑定

一个值得注意的问题:由于只允许输入中文和英文,所以空格也是不被允许输入的,我们的输入法在输入连续的中文时,将词语中间自动识别为空格,所以导致不能输入连续的中文,只能一个字一个字的输入。关于这个问题的解决办法:

	filterName = (value = "") => {
	    return value.trim().replace(/[^a-zA-Z\u4e00-\u9fa5/s]/g,"");
	};

在正则匹配后面加了一个/s,代价是允许输入空格。如果需要这么做,可以考虑在后续提交表单时过滤掉所有的空格。

斟酌了一下还是只允许输入单字更方便,主要看产品能否接受。

要实现限制输入框内容为中文英文、数字、下划线、短横线、空格和点,可以使用 JavaScript正则表达式来完成。通过监听输入框的 `input` 或 `keypress` 事件,并利用正则表达式输入内容进行过滤。 ### 实现代码示例 以下是一个使用正则表达式JavaScript 示例代码,用于过滤输入框的内容: ```javascript document.getElementById('inputField').addEventListener('input', function (e) { // 正则表达式:允许中文英文、数字、下划线、短横线、空格和点 const regex = /^[\u4e00-\u9fa5a-zA-Z0-9_\-\s.]*$/; // 获取输入框的当前值 const inputValue = e.target.value; // 如果输入不符合正则规则,则过滤掉非法字符 if (!regex.test(inputValue)) { e.target.value = inputValue.replace(/[^\u4e00-\u9fa5a-zA-Z0-9_\-\s.]/g, ''); } }); ``` ### HTML 部分 ```html <input type="text" id="inputField" placeholder="请输入中文英文、数字、下划线、短横线、空格或点"> ``` ### 正则表达式解释 - `\u4e00-\u9fa5`:匹配中文字符范围。 - `a-zA-Z0-9`:匹配英文大小写字母和数字。 - `_`:匹配下划线。 - `-`:匹配短横线(在字符组中不需要转义)。 - `\s`:匹配空格。 - `.`:匹配点号。 - `^` 和 `$`:表示从字符串的开始到结束都必须匹配规则。 - `*`:表示允许零个或多个字符。 ### 说明 1. 正则表达式 `/^[\u4e00-\u9fa5a-zA-Z0-9_\-\s.]*$/` 用于验证输入内容是否符合要求。 2. 在 `input` 事件中,每次输入都会触发正则验证,如果不符合规则,则通过 `replace` 方法过滤掉非法字符。 3. 这种方法确保输入框中只能输入指定的字符类型,避免非法输入。 ### 扩展用法 如果希望在用户输入非法字符时给出提示,可以在过滤字符的同时触发一个警告信息: ```javascript if (!regex.test(inputValue)) { e.target.value = inputValue.replace(/[^\u4e00-\u9fa5a-zA-Z0-9_\-\s.]/g, ''); alert('只能输入中文英文、数字、下划线、短横线、空格和点'); } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值