Datatables插件中的正则表达式无法处理带重音字符的情况。

3
我正在尝试使用正则表达式实现Datatables搜索。如果我搜索"lu..a"(返回Lucia、Luzia、LUZIA等),它可以正常工作,但是如果我尝试搜索"concei..o"(寻找Conceição、conceicao等),就无法正常工作。
问题出在数据库中的带重音字符,例如"ç"或"ã"(pt_BR)。
我已经尝试了去重音插件,但它产生了相反的效果(https://datatables.net/plug-ins/filtering/type-based/accent-neutralise)。
在表格初始化时有很多选项,我这里省略了一些(按钮、翻译等),但一个重要的细节是该表格正在从服务器端检索数据。
以下是搜索代码:
来源:https://datatables.net/examples/api/multi_filter.html
// Setup - add a text input to each footer cell
$('.exportTable tfoot th.select-filter').each(function() {
  var title = $(this).text();
  $(this).html('<div class="form-group form-float" style="width: 100%">' +
    '<div class="form-line">' +
    '<input class="form-control" placeholder="' + title + '" title="Filtrar ' + title + '" type="text" style="width: 100%">' +
    '</div>' +
    '</div>');
});

table = $('.exportTable').DataTable();

// Apply the search
table.columns().every(function() {
  var that = this;
  $('input', this.footer()).on('keyup change', function() {
    if (that.search() !== this.value) {
      that
        .search(this.value, true, false, true)
        .draw();
    }
  });
});

你确定它不工作吗?这里能正常运行:https://plnkr.co/edit/AQsAqOY1biByRz1AwBVi?p=preview - Vivek Athalye
我刚刚发现只有在服务器端处理时才不起作用。我编辑了问题。 - Marcelo Barros
1个回答

4
你只需要一个更完整的变音符号表。我不保证这个表格是完整的,但是它是目前我所知道的最好的。包括脚本和。

jQuery.fn.DataTable.ext.type.search.string = function (s) {
    return removeDiacritics(s)
};

一个与Conceição相关的演示 -> https://jsfiddle.net/s2yo99de/


更新:上述解决方案现已作为官方DataTables插件的一部分包含在内。
排序 -> https://datatables.net/plug-ins/sorting/diacritics-sort
过滤 -> https://datatables.net/plug-ins/filtering/type-based/diacritics-neutralise

我尝试了您的答案,它在客户端处理方面运行良好。我的表从服务器检索数据,在这种情况下它无法正常工作。 很抱歉之前没有提到它。我不知道这是一个不同的情况。 您知道这种情况需要什么吗? - Marcelo Barros
@MarceloBarros,?? 没有任何迹象表明您正在使用服务器端处理。请确切地展示您如何初始化dataTable以及您使用的哪种类型的服务器端脚本(我猜您正在使用标准脚本,不同的服务器端平台之间可能会有所不同)。 - davidkonrad
这里是完整的代码:https://gist.github.com/marcelobdsilva/1a092089043acca4a6059f5bddc4c5e1 - Marcelo Barros
@MarceloBarros,好的,但是服务器端脚本/api/customers-data才是有趣的部分 :) 这就是你需要摆脱那些变音符号的地方。我只能猜测你在做什么和使用哪个平台,但是在脚本的某个地方,你会根据传递的条件检索行,在mysql中,你可以通过...where table like '%xyz%' collate utf8_general_ci来强制忽略重音字符...如果你使用mysql,请尝试将collate utf8_general_ci添加到语句中。 - davidkonrad
明白了。我正在使用Laravel PHP框架和Yajra的Datatables包在后端工作,所以如果我试图在问题中解释所有这些,可能会非常混乱。但是我现在有了参考,并将尝试在后端实现它。变音符号是正确的答案。非常感谢! - Marcelo Barros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接