Javascript 创建自定义jQuery筛选器

Javascript 创建自定义jQuery筛选器,javascript,jquery,regex,Javascript,Jquery,Regex,我刚刚了解到,您可以非常轻松地为jquery创建自定义过滤器,并组合一个过滤器,以便在文本内容或任何属性上使用正则表达式匹配函数 我预先设置了要与普通正则表达式匹配的属性,我知道这很奇怪,请不要被这抛到脑后,或者少考虑我 我遇到的问题是,正则表达式中是否有要匹配的括号。有时它是好的,有时它会导致语法错误 精细::匹配(src/jquery.+\.(js)/i) 错误::匹配(src/jquery.+\.js()/i) 有人能从这个代码中告诉我这种行为的原因吗 // create new jque

我刚刚了解到,您可以非常轻松地为jquery创建自定义过滤器,并组合一个过滤器,以便在文本内容或任何属性上使用正则表达式匹配函数

我预先设置了要与普通正则表达式匹配的属性,我知道这很奇怪,请不要被这抛到脑后,或者少考虑我

我遇到的问题是,正则表达式中是否有要匹配的括号。有时它是好的,有时它会导致语法错误

精细:
:匹配(src/jquery.+\.(js)/i)
错误:
:匹配(src/jquery.+\.js()/i)

有人能从这个代码中告诉我这种行为的原因吗

// create new jquery filter
jQuery.expr[':'].match = function(e,i,p) { // element, index, params

    // split params by custom format
    m = p[3].match(/^([a-z]*)(\/?)(.+)\2([a-z]*)$/)

    // set the attribute to be checked
    myAttr = m[1] ? m[1] : 'text'

    // define regex, including switches
    myRegExp = new RegExp(m[3],m[4]);

    // check for and return matched elements
    if(myAttr == 'text')
        return $(e).text().match(myRegExp)
    else
        return $(e).attr(myAttr) ? $(e).attr(myAttr).match(myRegExp) : false
};

// used like this
// :match(attr/regex/switches)
// or with default match (text) and case insensitivity switch (i):
// :match(/HeLlO WoRl/i)
// or in simplest form
// :match(RegexPattern)

// alert how many jquery plugins of the form jquery.something.js
alert($('script:match(src/jquery.+\.js/i)').length)

由于我对这个问题的回答非常好,我决定将我的过滤器重新设计成一个名为match的插件函数。有人对如何改进有什么意见吗?它是否适用于所有情况

// will save as file called jquery.match.js
// will wrap with
// (function($){
$.fn.match = function(regex, attr){ // optional attr
    return this.filter(function(){
        var subject = attr ? $(this).attr(attr) : $(this).text()
        return subject && subject.match(regex) ? 1 : 0
    })
}
// and end with
// })

// used like this: $('body *').match(/some content/)
// or to match attributes like this: $('script').match(/jquery/i,'src')

您的代码似乎失败了,因为第二个正则表达式中有额外的括号。由于jQuery在您可以解析表达式之前就已经解析了,并且不知道预定义的格式,因此它将看到
:match(src/jQuery.+\.js()/i)
:match(src/jQuery.+\.js()
+
/i)
。请注意,第二个括号被解释为接近匹配项

也许有一种方法可以告诉jQuery接受该
的转义版本,但我不确定如何接受

或者 您可以像这样使用jQuery函数

$('script').filter( function(){
    return $(this).attr("src").match( /jquery/i ); 
});
为了达到插件提供的类似通用性水平,您可以创建一个更高阶的函数来完成这项工作

function createFilterFunction(regex, /*optional*/ attr){
    return function(){
        if( !attr ){
            return $(this).text().match(myRegex);
        }
        return $(this).attr(attr) ? $(this).attr(attr).match(regex) : false;
    };
}
然后你可以像这样使用它:

var isJquery = createFilterFunction( /jquery.+\.js()/i, "src" );
alert( $('script').filter( isJquery ).length );
旁注
在编写javascript时,如果变量前面没有包含
var
,它们将“泄漏”到全局命名空间中。因此,您的变量
m
myAttr
myRegExp
对任何使用您的脚本的人都是可见的,更重要的是,它将更改它们的值
m
myAttr
,以及
myRegExp
(如果存在)。改为像
var m=…
那样声明它们。

由于第二个正则表达式中的额外括号,您的代码似乎失败了。由于jQuery在您可以解析表达式之前就已经解析了,并且不知道预定义的格式,因此它将看到
:match(src/jQuery.+\.js()/i)
:match(src/jQuery.+\.js()
+
/i)
。请注意,第二个括号被解释为接近匹配项

也许有一种方法可以告诉jQuery接受该
的转义版本,但我不确定如何接受

或者 您可以像这样使用jQuery函数

$('script').filter( function(){
    return $(this).attr("src").match( /jquery/i ); 
});
为了达到插件提供的类似通用性水平,您可以创建一个更高阶的函数来完成这项工作

function createFilterFunction(regex, /*optional*/ attr){
    return function(){
        if( !attr ){
            return $(this).text().match(myRegex);
        }
        return $(this).attr(attr) ? $(this).attr(attr).match(regex) : false;
    };
}
然后你可以像这样使用它:

var isJquery = createFilterFunction( /jquery.+\.js()/i, "src" );
alert( $('script').filter( isJquery ).length );
旁注
在编写javascript时,如果变量前面没有包含
var
,它们将“泄漏”到全局命名空间中。因此,您的变量
m
myAttr
myRegExp
对任何使用您的脚本的人都是可见的,更重要的是,它将更改它们的值
m
myAttr
,以及
myRegExp
(如果存在)。改为像
var m=…
那样声明它们。

只是好奇,jQuery是否有此功能的文档?我似乎找不到它。我希望能在评论过的源代码中找到它,但我没有看。只是好奇,jQuery有这个特性的文档吗?我似乎找不到它。我希望能在注释过的源代码中找到它,但我没有查找。感谢全局变量的指针。我采纳了你的优秀答案,并将其重新制作成一个插件。你能帮我在刚编辑好的问题的末尾看一下吗?我认为这很好,但我想你可以检查一下,因为它是从你的代码开始的:)谢谢你给全局变量的指针。我采纳了你的优秀答案,并将其重新制作成一个插件。你能帮我在新编辑的问题的末尾看一下吗?我认为这很好,但我想你可以检查一下,因为它是从你的代码开始的:)