Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中特殊字符的不对称搜索_Javascript_Search - Fatal编程技术网

JavaScript中特殊字符的不对称搜索

JavaScript中特殊字符的不对称搜索,javascript,search,Javascript,Search,我试图实现一个字典web应用程序的非对称搜索,例如,搜索ü将只返回实际包含ü的标记,但搜索u将同时返回u和ü。(这样,不知道如何键入特殊字符的用户仍然可以搜索这些字符,但知道如何键入字符的用户不会被不必要的普通字符表单淹没。) 它必须是客户端JavaScript,而不需要任何外部库 我通过以下功能运行搜索词和正在搜索的文本,有效地将特殊字符与普通字符合并,从而实现了第二种搜索类型: function cleanUp(dirty) { cleaned = dirty.replace(/[á

我试图实现一个字典web应用程序的非对称搜索,例如,搜索ü将只返回实际包含ü的标记,但搜索u将同时返回u和ü。(这样,不知道如何键入特殊字符的用户仍然可以搜索这些字符,但知道如何键入字符的用户不会被不必要的普通字符表单淹没。)

它必须是客户端JavaScript,而不需要任何外部库

我通过以下功能运行搜索词和正在搜索的文本,有效地将特殊字符与普通字符合并,从而实现了第二种搜索类型:

function cleanUp(dirty) {
    cleaned = dirty.replace(/[áàâãäāă]/ig,"a");
    cleaned = cleaned.replace(/đ/ig,"d");
    cleaned = cleaned.replace(/[éèêẽëēĕ]/ig,"e");
    cleaned = cleaned.replace(/[íìîĩïīĭ]/ig,"i");
    cleaned = cleaned.replace(/ñ/ig,"n");
    cleaned = cleaned.replace(/[óòôõöōŏ]/ig,"o");
    cleaned = cleaned.replace(/[úùûũüūŭ]/ig,"u");
    return cleaned;
}
然后,我将字符串与以下内容进行比较以获得结果:

var search_term = cleanup(search_input.value);
var text_to_search = cleanup(main_text);
if (text_to_search.indexOf(search_term) > -1) ... //do something
它不优雅,但很管用。清理两个字符串后,用户可以搜索uber和getüber,即使他们不知道如何键入ü。但如果他们知道怎么做,直接搜索über也会返回像uber这样的东西,这是我不想要的

我已经考虑过一些事情,比如为每个搜索词分别检查每个特殊字符,或者复制每个具有特殊字符的词典条目,以生成特殊字符和纯字符版本,但我所有的想法都会严重减慢搜索的处理时间


非常感谢任何想法。

我最后检查了搜索词是否包含任何特殊字符,如果包含,我没有通过
cleanup()
,将其与原始词典条目进行比较,而不是与
清理后的
条目进行比较。谢谢大家的评论。

你发布的答案听起来很合理

我只想建议一种更简洁的方法(双关语)来编写
cleanup()
函数和执行一系列字符串操作的类似函数:

function cleanUp(dirty) {
    return dirty
        .replace(/[áàâãäāă]/ig,"a")
        .replace(/đ/ig,"d")
        .replace(/[éèêẽëēĕ]/ig,"e")
        .replace(/[íìîĩïīĭ]/ig,"i")
        .replace(/ñ/ig,"n")
        .replace(/[óòôõöōŏ]/ig,"o")
        .replace(/[úùûũüūŭ]/ig,"u");
}

如果你想让它是私有的,请确保在你的函数中用
var
关键字声明
cleaned
变量。不要清理输入字符串,如果输入字符串中有特殊字符,不要清理test\u to\u search eitherHow,而不是用字典的清理副本做些什么,你用的是脏拷贝吗?我的意思是,仍然在清理过的字典中搜索,但只返回脏字典中的字符串。因为脏拷贝和干净拷贝应该仍然具有相同的大小,并且在相同的位置也将具有相同的字符。这意味着搜索uber或über将返回über,而搜索über只能返回über。另一种方法可以从输入字符串构建RegExp(),例如,将“hum”转换为/\bh[ùũūŭu]m\b/g,然后调用text_to_search.match(myRX)而不是每次都进行所有替换和操作文本搜索…if(myInput.match(dirty))skipthedictionarycleanup()