正则表达式以防止输入中出现重音字母



我想阻止输入重音字母(任何语言(,最好我希望通过属性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 SilvaPedroFabio Duarte...

拒绝João SilvaPedro CamõesFá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 PO​NY HE COMES"

警告

正如下面的评论中@Stephen P链接的文章所指出的那样,这可能是一个坏主意。值得仔细考虑的是,您是否想冒着惹恼甚至冒犯用户的风险,强迫他们输入不是他们真实姓名的内容。

最新更新