具有“OR”条件的正则表达式在DataTable fnFilter中不起作用

时间:2014-03-01 01:17:54

标签: javascript jquery regex datatable jquery-datatables

我正在使用DataTables 1.9.6并尝试对我的项目进行列多重过滤,使用DataTables的fnFilter函数没有运气。我已经在论坛中尝试了所有建议的方法来使其工作,但仍然无法使其正常工作。

我的问题是,OR运算符'|'甚至'||'使用字符串值来过滤列不起作用。

以下是我在DataTables论坛发布的问题:
http://datatables.net/forums/discussion/19737/regex-with-or-condition-doenst-work-in-fnfilter

<小时/> 我使用DataTables Debug BookMarklet上传我的数据表,调试代码是'olohos'。

我的问题是,OR运算符'|'甚至'||'使用字符串值过滤列在我的Web应用程序中不起作用。

例如,如果我有以下代码

$('.search_init').keyup(function()
{
var asEscapedFilters = [];
asEscapedFilters[0] = $(this).val();
asEscapedFilters[1] = 'Y';
oTable.fnFilter(asEscapedFilters[0] | asEscapedFilters[1], $('#example tr.inputs input').index(this), true, false);
});

在“Order Active”列的搜索区域输入字符串“I”,它应该返回“Order Active”列中包含“I”或“Y”的所有行。相反,它返回零行。

如果我使用'||'而不是'|'如下所示,

$('.search_init').keyup(function()
{
var asEscapedFilters = [];
asEscapedFilters[0] = $(this).val();
asEscapedFilters[1] = 'Y';
oTable.fnFilter(asEscapedFilters[0] || asEscapedFilters[1], $('#example tr.inputs input').index(this), true, false);
});

它返回'Order Active'列的'Y'行,但不返回带'I'的行。

我已经花了很多时间,看看这个问题,非常感谢任何有用的建议来获得这项工作。

处理是服务器端,它是否需要它来处理任何其他语法或设置?


DataTables BookMarklet结果。

http://debug.datatables.net/olohos

任何有助于此工作的帮助表示赞赏。

非常感谢提前。

1 个答案:

答案 0 :(得分:1)

我不明白你的意思是'处理是服务器端'。您显示的代码是所有JavaScript代码,并在浏览器中运行。

所以,你有JavaScript代码,但这里没有正则表达式:

oTable.fnFilter(asEscapedFilters[0] | asEscapedFilters[1], $('#example tr.inputs input').index(this), true, false);

因此,代码中的|是JavaScript运算符bitwise OR

在您的其他尝试中,||是JavaScript运算符logical OR

DataTables文档说明fnFilter()的第一个参数是'{string}:String来过滤表',第三个参数是一个标志,指示是按字符串还是按常规处理字符串表达。因此,您需要创建一个字符串,该字符串将是RegExp()

的构造函数的有效输入

任何时候文本(字符串)都是从用户输入或源代码外部的任何源获得的,需要正确处理它以避免意外错误和安全漏洞,例如在应用进一步处理时的代码注入,如正则表达式。这同样适用于SQL,shell命令,HTML以及计算机将解析和处理的任何其他内容。不幸的是,当我搜索时,我发现JavaScript标准库没有提供任何内置函数来为您执行此操作。 MDN文档提供了一个功能,您可以将其包含在代码中,以便在使用它生成正则表达式之前正确地转义用户的输入。请参阅下面的参考资料。

对代码的更正如下:

$('.search_init').keyup(function()
    {
    var asEscapedFilters = [];
    asEscapedFilters[0] = $(this).val();
    asEscapedFilters[1] = 'Y';
    var filterPattern = escapeRegExp(asEscapedFilters[0])
                        + "|" + escapeRegExp(asEscapedFilters[1]);
    oTable.fnFilter(filterPattern, $('#example tr.inputs input').index(this), true, false);
    });

请注意,此代码中的|不是JavaScript运算符,而是字符串中的字符。该字符串将由datatables库传递给RegExp()的构造函数。我创建了另一个局部变量,通过保持参数更简单,从而更加紧凑和具有描述性名称来增加函数调用的可读性。如果模式的第二部分始终是常量,则不需要对其进行转义,您可以这样写:var filterPattern = escapeRegExp($(this).val()) + "|Y";

参考文献: