2010-11-23 23 views
8

Mi código:acento expresiones regulares insensibles

jQuery.fn.extend({ 
highlight: function(search){ 
    var regex = new RegExp('(<[^>]*>)|('+ search.replace(/[.+]i/,"$0") +')','ig'); 

    return this.html(this.html().replace(regex, function(a, b, c){ 
    return (a.charAt(0) == '<') ? a : '<strong class="highlight">' + c + '</strong>'; 
    })); 
} 

}); 

quiero destacar letras con acentos, es decir:

$('body').highlight("cao"); 

debe destacar: [CaO] O [CaO] O [cáo] O expre [cão] tion O [Cáo] tion

¿Cómo puedo hacer eso?

Respuesta

5

La única forma correcta de hacerlo es ejecutarlo primero a través de Forma de normalización Unicode D, descomposición canónica.

Luego quita todas las marcas que resulten (\pM caracteres, o quizás \p{Diacritic}, según corresponda), y ejecute su coincidencia con la versión de/no marcada.

Bajo ninguna circunstancia, codifique un montón de literales. ¡Eek!

Boa sorte!

+3

¿Le importaría compartir algún ejemplo de código? – billy

+0

¿Cómo puedo hacer eso? ¡Es una respuesta a medias, solo apunta a la solución! – kravemir

3

Necesita crear una tabla de caracteres alternativos y generar dinámicamente una expresión regular basada en eso. Por ejemplo:

var alt = { 
    'c': '[cCç]', 
    'a': '[aAãÃá]', 
    /* etc. */ 
}; 

highlight: function (search) { 
    var pattern = ''; 
    for (var i = 0; i < search.length; i++) { 
    var ch = search[i]; 
    if (alt.hasOwnProperty(ch)) 
     pattern += alt[ch]; 
    else 
     pattern += ch; 
    } 

    ... 
} 

Entonces, para search = 'cao' Esto generará un patrón [cCç][aAãÃá]o.

Cuestiones relacionadas