[英]Regular expression to force single blank space after a first character
如何在用户输入第一个字符后强制使用空格。 我只需要在第一个字符之后留一个空格(在第一个字符之前不允许有空格)。 在第一个字符和空格之后,最多可以有40个字符。
到目前为止,我发现了这个,但不符合我的需求
$('.singleSpace').keyup(function() {
var foo = $(this).val().split(" ").join(""); // remove hyphens
if (foo.length > 0) {
foo = foo.match(new RegExp('.{1}', 'g')).join(" ");
}
$(this).val(foo);
});
我不知道为什么要这样做,但是要删除空格,可以使用以下命令:
var str = $(this).val().replace(" ", "");
并在第一个字符后添加一个空格:
var str = $(this).replace("^(.)(.*)$", "$1 $2");
您需要正则表达式吗?
$('.singleSpace').keyup(function() {
var $el = $(this);
var val = $el.val();
if (val.length === 1) {
$el.val(val + ' ');
}
});
您可以使用以下代码:
$('.singleSpace').keyup(function() {
var foo = $(this).val().replace(/^( *)([^ ] *)(.*)/g, function(_,b,c,d){
return $.trim(c) + ' ' + d.replace(/ /g, '').slice(0,40);
})
$(this).val(foo)
});
唯一的问题是光标位置。 如果您在光标不在结尾处键入内容,则光标将始终返回结尾。
自己看看: http : //jsfiddle.net/S3gJL/2/
我建议您将函数放在模糊事件中,但这也可能很烦人。
您的要求一点都不简单。 有很多变化,用户可以复制粘贴,选择和删除。 很难阻止一切。
上面提供的代码阻止了很多弯路(只有不阻止的事情是右键单击粘贴,也许还有其他我没有想到的事情 ),但是具有上述成本。 您可能想要搜索插件或雇用某人来开发一个好的系统。
删除第一个之后的写空间授权。
对于此处的光标位置,修复:
$('.singleSpace').keyup(function() {
var foo = this.value.replace(/^( *)([^ ] *)(.*)/g, function(a,b,c,d,e){
return $.trim(c) + ' ' + d.replace(/ /g, '').slice(0,40);
})
var carretPos = doGetCaretPosition(this)
carretPos += foo.length - this.value.length
this.value = foo;
setSelectionRange(this, carretPos, carretPos)
});
//Code taken from
// http://stackoverflow.com/questions/17858174/set-cursor-to-specific-position-on-specific-line-in-a-textarea
function setSelectionRange(input, selectionStart, selectionEnd) {
if (input.setSelectionRange) {
input.focus();
input.setSelectionRange(selectionStart, selectionEnd);
}
else if (input.createTextRange) {
var range = input.createTextRange();
range.collapse(true);
range.moveEnd('character', selectionEnd);
range.moveStart('character', selectionStart);
range.select();
}
}
//Code taken from
// http://stackoverflow.com/questions/2897155/get-cursor-position-in-characters-within-a-text-input-field
function doGetCaretPosition (oField) {
// Initialize
var iCaretPos = 0;
// IE Support
if (document.selection) {
// Set focus on the element
oField.focus ();
// To get cursor position, get empty selection range
var oSel = document.selection.createRange ();
// Move selection start to 0 position
oSel.moveStart ('character', -oField.value.length);
// The caret position is selection length
iCaretPos = oSel.text.length;
}
// Firefox support
else if (oField.selectionStart || oField.selectionStart == '0')
iCaretPos = oField.selectionStart;
// Return results
return (iCaretPos);
}
完成var处理光标位置
var val="";
$('.singleSpace').keyup(function() {
var ele = $(this)[0];
var foo = ele.value;
if(val==foo){return false}
var startPos = ele.selectionStart;
var endPos = ele.selectionEnd;
if(event.keyCode==8){
var diff=endPos-startPos;
startPos-=diff;
endPos-=diff;
}
foo = foo.replace(new RegExp('( )','g'),'');
foo = foo.replace(new RegExp('^ *(.) *(.*?)'),'$1 $2');
val=foo;
ele.value=foo;
ele.selectionStart=startPos;
ele.selectionEnd=endPos;
});
这是您想要的regExp: *(.) *(.*?)
并且您想使用.replace不匹配
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.