2012-01-18 69 views
7

estoy usando una extensión de jQuery "contains", se muestra a continuación:expresiones regulares en Javascript con jQuery Contiene expresiones regulares extensión

$.extend($.expr[':'],{ 
    containsExact: function(a,i,m){ 
     return $.trim(a.innerHTML.toLowerCase()) === m[3].toLowerCase(); 
    }, 
    containsExactCase: function(a,i,m){ 
     return $.trim(a.innerHTML) === m[3]; 
    }, 
    containsRegex: function(a,i,m){ 
     var regreg = /^\/((?:\\\/|[^\/])+)\/([mig]{0,3})$/, 
     reg = regreg.exec(m[3]); 
     return RegExp(reg[1], reg[2]).test($.trim(a.innerHTML)); 
    } 
}); 

Tengo una tabla con ciertas células que estoy tratando de formato condicional, por lo Estoy usando la extensión en un selector td, con la función containsRegex. El problema con el que me estoy metiendo es que muchas de las expresiones regulares que estoy tratando de usar (que he probado en javascript regex testers como this y que han funcionado) no funcionan con esta función. Estas son las diferentes cadenas que me gustaría para que coincida con:

Tenga en cuenta que una "x" puede ser hacha, T, F o V y una "X" puede ser una X, T, F o V. Por último, un "(mb)" podría ser cualquier dos letras minúsculas az entre paréntesis.

-, (mb), x *, x * (mb), X, X (mb), X *, X * (mb), X

Y aquí es el código con varias de las expresiones regex que estoy usando:

$("td:containsExact('-')").addClass("0 queue"); // - 
$("td:containsRegex('/[^xtfv*]\([a-z]{2}\)/g')").addClass("1 active"); // (mb) 
$("td:containsRegex('/\b[xtfv]\*(?!\()/g')").addClass("2 queue review"); // x* 
$("td:containsRegex('/\b[xtfv]\*(?:\([a-z]{2}\))/g')").addClass("3 active review"); // x*(mb) 
$("td:containsRegEx('/\b[xtfv](?![*\(])/g')").addClass("4 queue"); // x 
$("td:containsRegEx('/\b[xtfv](?:\([a-z]{2}\))/g')").addClass("5 active"); // x(mb) 
$("td:containsRegEx('/\b[XTFV]\*(?!\()/g')").addClass("6 queue review"); // X* 
$("td:containsRegEx('/\b[XTFV]\*(?:\([a-z]{2}\))/g')").addClass("7 active review"); // X*(mb) 
$("td:containsRegEx('/\b[XTFV](?![*\(])/g')").addClass("8 done"); // X 

La mayoría de estos errores pasan en Chrome. ¿Alguien tiene alguna indicación? ¿La extensión contains está limitada de alguna manera?

Gracias de antemano por su ayuda!

+0

Como referencia: el error que pasa es "error no detectada Sintaxis, expresión no reconocida:)/g ')" en "x *" y "X *". Aplica apropiadamente la clase a "(mb)" pero también aplica esas mismas clases para "x * (mb)" ... El resto de las búsquedas no pasan errores, pero tampoco encuentran coincidencias. – mbeasley

Respuesta

5

Ok, creo que lo tengo ... Estos son los cambios que hice:

  • Los cinco últimos selectores tienen una "E" de capital y deben ser "containsRegex()"
  • todo he cambiado la containsRegex un poquito por la adición de un "registro" el registro de entrada del retorno, para que sea más robusto:

    containsRegex: function(a,i,m){ 
        var regreg = /^\/((?:\\\/|[^\/])+)\/([mig]{0,3})$/, 
        reg = regreg.exec(m[3]); 
        return reg ? RegExp(reg[1], reg[2]).test($.trim(a.innerHTML)) : false; 
    } 
    
  • Todos los caracteres de escape en la necesidad de expresiones regulares que ser de doble escape (es decir \( tiene que ser \\()

  • me quitó todas las comillas simples para ayudar en realidad me se distraiga

  • Quité los números de los nombres de clase. Sé que las identificaciones no deberían comenzar con números y estoy bastante seguro de que los nombres de las clases no deberían comenzar o solo ser un número. De todos modos, esto llevó a algunos selectores a agregar la misma expresión regular (es decir, "x" y "-" tienen el mismo aspecto, así como "x * (mb)" y "X * (mb)" con el CSS en la demostración).

De todos modos, voy a actualizar mi GIST con este código y el demo:

/* jQuery selector to match exact text inside an element 
* :containsExact()  - case insensitive 
* :containsExactCase() - case sensitive 
* :containsRegex()  - set by user (use: $(el).find(':containsRegex(/(red|blue|yellow)/gi)')) 
*/ 
$.extend($.expr[':'],{ 
    containsExact: function(a,i,m){ 
    return $.trim(a.innerHTML.toLowerCase()) === m[3].toLowerCase(); 
    }, 
    containsExactCase: function(a,i,m){ 
    return $.trim(a.innerHTML) === m[3]; 
    }, 
    containsRegex: function(a,i,m){ 
    var regreg = /^\/((?:\\\/|[^\/])+)\/([mig]{0,3})$/, 
    reg = regreg.exec(m[3]); 
    return reg ? RegExp(reg[1], reg[2]).test($.trim(a.innerHTML)) : false; 
    } 
}); 

// -, (mb), x*, x*(mb), x, x(mb), X*, X*(mb), X 

$("td:containsRegex(/^[xtfv]$/)").addClass("queue"); // x 
$("td:containsRegex(/^[xtfv]\\*$/)").addClass("queue review"); // x* 
$("td:containsRegex(/^\\([a-z]{2}\\)$/)").addClass("active"); // (mb) 
$("td:containsRegex(/^[xtfv]\\([a-z]{2}\\)$/)").addClass("active"); // x(mb) 
$("td:containsRegex(/^[xtfv]\\*\\([a-z]{2}\\)$/)").addClass("active review"); // x*(mb) 

$("td:containsRegex(/^[XTFV]$/)").addClass("done"); // X 
$("td:containsRegex(/^[XTFV]\\*$/)").addClass("queue review"); // X* 
$("td:containsRegex(/^[XTFV]\\*\\([a-z]{2}\\)$/)").addClass("active review"); // X*(mb) 

$("td:containsExact(-)").addClass("queue"); // - 
+0

Oh hombre - funcionó perfectamente. Pasé por alto por completo el doble escape, que sé que creo que entiendo la lógica subyacente. Lo de Regex frente a RegEx fue algo tonto para que lo pasara por alto, pero me alegro de que lo hayas captado. Y aprecio los cambios en tu extensión 'contains'. Eso es realmente una excelente pieza de código, así que una vez más, ¡gracias! – mbeasley

+0

He actualizado [la esencia] (https://gist.github.com/461488) que contiene este código para trabajar con jQuery 1.8+. Nota porque de los cambios a la función 'expr', la función': containsRegex() 'ahora requieren citas dentro de los paréntesis. – Mottie

2
"td:containsRegex('/\b[xtfv]\*(?!\()/g')" 

\b dentro de una cadena literal medios de retroceso ("\b" === "\x08"), mientras que significa wordbreak en una expresión regular. Intente reemplazar todos los \b con \\b.

También debe cambiar correctamente \( a [(] ya que en JS, "foo\(bar\)" === "foo(bar)".

+0

Desafortunadamente, lo único que ayudó fue reemplazar el \ (con [(] donde busca "x *" y "X *" - pero todo lo que hizo fue evitar el error mencionado en mi comentario original. Sin embargo, el único eso es el desencadenante "(mb)" y desafortunadamente ese todavía está aplicando el gatillo para "x * (mb)" también ... Gracias. Todo esto parte de la solución de problemas, supongo. – mbeasley

Cuestiones relacionadas