我想阻止输入重音字母(任何语言(,最好我希望通过属性pattern
用正则表达式完成此块
我尝试了一些东西,但没有成功...
<form>
<label for="username">Name <i>(only letters without accent)</i></label>
<br>
<input name="username" id="username" type="text" pattern="[A-Za-z]+" oninvalid="this.setCustomValidity('Only letters without accent')">
</form>
接受:Joao Silva
,Pedro
,Fabio Duarte
...
拒绝:João Silva
,Pedro Camões
,Fábio Duarte
...
<input name="username" id="username" type="text"
pattern="[A-Za-z ]*" title="Latin letters and space characters only"> />
在此处测试此代码。
或者,您可以控制键入过程中允许的字符。
<input name="username" id="username" type="text" onCopy="return false"
onDrag="return false" onDrop="return false" onPaste="return false"
autocomplete=off />
j查询:
$(document).ready(function() {
$("#username").keypress(function(event) {
var inputValue = event.which;
if(!((inputValue >= 65 && inputValue <= 90) || // A-Z
(inputValue >= 97 && inputValue <= 122) || // a-z
(inputValue == 32))) { // space
event.preventDefault();
}
});
});
在此处测试此代码。
原始答案
如问题中所述,听起来您想阻止除基本拉丁字母和空格以外的任何内容,这可以通过pattern
属性来实现 - 正则表达式是^[a-zA-Z ]+$
.
编辑 2020-08-19
该问题专门询问"重音字母">,而不是非拉丁字母字符或非ASCII字符。截至 2020 年,假设您不需要支持 Internet Explorer,这实际上在 JavaScript 中检查起来相当简单。
解释
NFD 规范化将所有变音符号与其基本字符分开。正则表达式/p{M}/u
匹配 Unicode "Mark" 类别中的任何内容,例如我们刚刚拆分的所有变音符号。
const hasDiacritics = str =>
/p{M}/u.test(str.normalize('NFD'))
// tests
;[
'Joao Silva',
'Pedro',
'Fabio Duarte',
'João Silva',
'Pedro Camões',
'Fábio Duarte',
'Αρσένιος',
'Αρσενιος',
'Александра',
'李晓华',
].forEach(str => {
console.log(str, hasDiacritics(str))
})
您可以使用类似的方法来去除音调符号:
const stripDiacritics = str =>
str.normalize('NFD').replace(/p{M}+/gu, '')
stripDiacritics('ZA̡͊͠͝LGΌ ISͮ̂҉̯͈͕̹̘̱ TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝S̨̥̫͎̭ͯ̿̔̀ͅ')
// => "ZALGΟ IS TOƝy THE PONY HE COMES"
警告
正如下面的评论中@Stephen P链接的文章所指出的那样,这可能是一个坏主意。值得仔细考虑的是,您是否想冒着惹恼甚至冒犯用户的风险,强迫他们输入不是他们真实姓名的内容。