我有一个过滤搜索我的数据。当我输入土耳其字符时,它不起作用。如何修改此代码?
var $rows = $('#tableExport tr');
$('#search').keyup(function() {
var val = '^(?=.*\\b' + $.trim($(this).val()).split(/\s+/).join('\\b)(?=.*\\b') + ').*$',
reg = RegExp(val, 'i'),
text;
$rows.show().filter(function() {
text = $(this).text().replace(/\s+/g, ' ');
return !reg.test(text);
}).hide();
});
这些是人物ç,ı,ğ,ö,ş,ü,Ç,İ,Ğ,Ö,Ş,Ü
答案 0 :(得分:1)
这里有两个问题:1)\b
不支持Unicode,2)i
在不区分大小写的模式中使用时只匹配无点I
,而不是虚线对应物。
我建议两个场景:1)空白边界,或2)ASCII字符+土耳其字母边界。
模式非常相似。以下是基于空白边界的代码示例:
var val = '^(?=.*(?:^|\\s)(?:' + $.trim($(this).val()).split(/\s+/).join('|') + ')(?!\\S))',
reg = RegExp(val.replace(/[İi]/ig, '[iİ]'), 'i'),
此处,模式看起来像/^(?=.*(?:^|\s)(?:[iİ]ç|Anadolu)(?!\S))/i
。请注意,.replace(/[İi]/ig, '[iİ]')
允许将点缀İ
与i
匹配。
另一种方法意味着我们需要用一个用土耳其字母否定ASCII字符char(\b
)的外观替换\w
:
var val = '^(?=.*(?:^|[^\\wçığöşüÇİĞÖŞÜ])(?:' +
$.trim($(this).val()).split(/\s+/).map(function(x) {
return x.replace(/[İi]/ig, '[iİ]');
}).join('|') + ')(?![\\wçığöşüÇİĞÖŞÜ]))',
reg = RegExp(val, 'i'),
此处,模式看起来像/^(?=.*(?:^|[^\wçığöşüÇİĞÖŞÜ])(?:[iİ]ç|Anadolu)(?![\wçığöşüÇİĞÖŞÜ]))/i
,并且可以安全地匹配非字母或非土耳其字母之间的字词。
答案 1 :(得分:0)
如果您使用的是React或angular,请尝试使用此方法。
const reg = new RegExp(q.toUpperCase()。replaceAll(/ [İi] / ig,'[iİ]'),'i')
q可能是来自客户端的对象或字符串。