javascript - 检测英语或法语中未找到的所有口音

标签 javascript

我发现自己需要检测字符串是否包含英语或法语中不存在的任何字符。该字符串是通过 HTML 输入字段收集的。

我找到了一些如何规范化字符串的示例,但这不是我需要做的(法语口音不应规范化)。

到目前为止,我发现自己正在这样做:

if (str.includes(invalidAccents)){
    //do something
} else {
    //do something else
}

我将列表放在一起存储在数组中:

var invalidAccents = [
    'á', 'ã', 'ä', 'å', 'ą', 'æ',
    'ĉ', 'ć',
    'ę',
    'ĝ',
    'ĥ',
    'í', 'ì', 'ł',
    'ĵ',
    'ñ', 'ń',
    'ó', 'ò', 'õ', 'ö', 'ø', 'œ', 'ó',
    'ŝ', 'ś',
    'ú', 'ŭ',
    'ÿ', 'ý',
    'ž', 'ź', 'ż',
    'ª',
    'ð',
    'ß',
    'ƒ',
    'þ',
    'µ',
    'Á', 'Ã', 'Ä', 'Å', 'Ą', 'Æ',
    'Ĉ', 'Ć',
    'Ę',
    'Ĝ',
    'Ĥ',
    'Í', 'Ì', 'Ł',
    'Ĵ',
    'Ñ', 'Ń',
    'Ó', 'Ò', 'Õ', 'Ö', 'Ø', 'Ó', 'Œ',
    'Ŝ', 'Ś',
    'Ú', 'Ŭ',
    'Ÿ', 'Ý',
    'Ž', 'Ź', 'Ż',
    'Ð',
    'Þ' 
];

但这远非高效且远非详尽。

有没有人有替代解决方案,或者至少有一个地方可以让我找到完整的口音列表来完成我要做的事情?

最佳答案

您可能最好以不同的方式处理这个问题:检查字符串是否仅包含有效字符,而不是检查它是否不包含无效字符。一旦您确定了哪个范围最有效,您可以使用 regular expression来解决此类任务。例如,假设可接受的字符是 A-Z,不考虑大小写;空格也可以。我们将创建这个正则表达式:

var validCharactersRegexp = /^[a-zA-Z\s]+$/i;

如果您不熟悉正则表达式,这看起来是一个相当大的代码!让我们来分解一下:

  • 整个内容都用斜杠 (/) 括起来。这是 JavaScript 用于正则表达式的语法。 (我们可以这样做 = new RegExp('^[a-zA-Z\s]+$', 'i') 并得到相同的结果,但是 /blah/ 语法更加简洁和通用。)
  • ^ 表示当我们使用此正则表达式时,我们将从字符串的最开头开始。
  • [A-Z\s] 是正则表达式简写,表示“这些字符中的任何一个,但不是任何其他字符”。 A-Z 是我们的字母; \s 表示任何空白字符。
  • +$ 部分意味着我们将搜索 + 之前的任何内容,直到到达 $ - 这类似于 ^,但它表示字符串的结束。本质上,这意味着我们将搜索整个字符串并确保其中的每个字符都与 + 之前的正则表达式代码匹配。
  • 最后,在/之后,i是一个标志,这意味着正则表达式应该不区分大小写。 (JavaScript 中有 several flags 可供我们使用,但 i 是这里唯一重要的。)

现在我们已经得到了实际的正则表达式,我们必须使用它来检查输入字符串是否有效 - 即它是否与我们的正则表达式匹配。我们将使用.test()函数来做到这一点:

function isValid(string) {
    return validCharactersRegexp.test(string);
}

为了展示这个作品,这里有一个快速演示:

var validCharactersRegexp = /^[A-Z\s]+$/i;

function isValid(string) {
    return validCharactersRegexp.test(string);
}

// Should be true.
console.log(isValid('apple'));

// Should also be true.
console.log(isValid('BaNaNa'));

// Should also be true!
console.log(isValid('Thou art a programmere'));

// Should be false - we didn't include punctuation in our regular expression after all.
console.log(isValid('Art thou a programmere?'));

// Should be false - "à" isn't in our regular expression.
console.log(isValid('Voilà'));

(PS:如果您确实想使用黑名单,即搜索无效字符而不是有效字符,正则表达式也可以实现这一点。只需执行 [^. ..],其中 ... 是不允许使用的字符。插入符号表示 [..] 的行为与正常情况相反 -仅当当前字符不是它指定的字符之一时,它才会匹配。请记住相应地调整正则表达式 - 在这种情况下,而不是搜索所有字符有效,我们将搜索任何无效字符。因此不需要 ^[..]+$ - 相反,我们只需执行 /[ ^...]/.test(string),查看字符串中的任何位置是否出现无效字符。)

关于javascript - 检测英语或法语中未找到的所有口音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55327247/

相关文章:

Javascript 如何在用户尝试退出或刷新页面时触发函数

javascript - jQuery Sortable - 允许将某些项目仅放入某些列表中

javascript - FocusEvent如何判断它是通过鼠标或选项卡触发的

javascript - 如何让表中的更改项与数据库同步?

JavaScript:大于或等于正零?

javascript - 使用动态计算的名称访问对象属性

java - 如何在zk中选择日历中的星期

javascript - 覆盖在 html 上不会全屏显示

javascript - 两个相互依赖的选择字段

javascript - 路由器在注入(inject) ngrx 存储定义解析器后停止工作