我正在尝试在 Javascript 中构建一个 12 小时的输入组件,并且我想在用户键入时实时验证格式,就像解析器验证传入的令牌一样。
我正在使用 react,所以在每次渲染中,字段值都会通过以下正则表达式传递:
const validTime = /(0[1-9])|(1[0-2]):([0-5][0-9])\s((a|p|A|P)(m|M))/;
我测试该值是否有效,如果不是,我向输入添加一个红色边框,但使用这种方法我可以写任何东西,它不会被提交,但你可以写一些类似ajsjjsdf 的东西,我正在寻找不同的东西. 允许用户仅实时键入上述正则表达式规则允许的字符。
编辑:
我正在添加一些代码...
基本上简化的输入是:
<input
ref={(input) => {this[keyName] = input}}
className="form-control"
placeholder="09:00 AM"
value={scheduleTime ? scheduleTime.value : ''}
onChange={(ev) => this.onChangeTimeSchedule(ev, keyName)}/>
和值处理程序:
onChangeTimeSchedule = (ev, scheduleKey) => {
const validChar = /[0-9]|[aApPmM]|[\s\b]|:/;
const validTime = /(0[1-9])|(1[0-2]):([0-5][0-9])\s((a|p|A|P)(m|M))/;
const { value } = ev.target;
if(!validTime.test(value))
return;
const { schedule } = this.state;
schedule[scheduleKey] = {value, invalid: false};
this.setState({schedule});
};
如果我使用 validChar,它将只允许我想要的字符,但它会允许像 10:aaaM 这样的字符串。
如果我在这种情况下使用 validTime(这是我对每个渲染进行的检查,如果无效则添加红色边框),我总是返回 false,因为它除了完全匹配:10:0 是错误的,10:00 PM 是正确的。