【讨论】如何通过正则表达式"限制"复杂输入<不是验证输入>
孔南 2006-03-13 11:06:14 通过正则表达式"验证"一个输入控件的值是很容易的,
但不知有没有完善的"限制"输入的办法.
要求:
1. 不破坏剪贴版数据. (调用 clipboardData.setData() 会破坏剪贴版数据)
2. 无闪烁现象. (在 onkeydown 后使用 regexp 进行替换就有闪烁现象)
3. 具有通用性. (可为每一个控件指定一个 regexp, 但使用相同的方式进行限制)
比如:
(1) 批准文号: /^[国卫][药食][准健]字 [a-z]\d{10}$/g
(2) 身份证号: /(?:^\d{15}$) | (?:^\d{17}[\d|X]$) /g
(3) 车牌号码: /^[晋冀鲁豫][A-Z]-[A-Z0-9]{4}[A-Z0-9挂]/g
附: 可以借鉴的方法 by LeXRus@BlueIdea
<script>
function regInput(obj, reg, inputStr){
var docSel = document.selection.createRange();
if (docSel.parentElement().tagName != "INPUT"){return false;}
oSel = docSel.duplicate();
oSel.text = "";
var srcRange=obj.createTextRange();
oSel.setEndPoint("StartToStart", srcRange);
var str = oSel.text + inputStr + srcRange.text.substr(oSel.text.length);
return reg.test(str);
}
</script>
中文: <xmp style= "display:inline"> </xmp>
<input
onkeypress="return regInput(this,/^[\u3447-\uFA29]*$/,String.fromCharCode(event.keyCode))"
onpaste="return regInput(this,/^[\u3447-\uFA29]*$/,window.clipboardData.getData('Text'))"
ondrop="return regInput(this,/^[\u3447-\uFA29]*$/,event.dataTransfer.getData('Text'))" value="只能输入中文"><br/>
只能输入数字和短横线:
<input
onkeypress="return regInput(this,/^[-\d]*$/,String.fromCharCode(event.keyCode))"
onpaste="return regInput(this,/^[-\d]*$/,window.clipboardData.getData('Text'))"
ondrop="return regInput(this,/^[-\d]*$/,event.dataTransfer.getData('Text'))"
value="86-021-12345678">