My code:
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>';
}));
}
});
I want to highlight letters with accents, ie:
$('body').highlight("cao");
should highlight: [ção] OR [çÃo] OR [cáo] OR expre[cão]tion OR [Cáo]tion
How can I do that?
The sole correct way to do this is to first run it through Unicode Normalization Form D, canonical decomposition.
You then strip our any Marks that result (\pM
characters, or perhaps \p{Diacritic}
, depending), and run your match against the de/un-marked version.
Do not under any circumstances hardcode a bunch of literals. Eek!
Boa sorte!
You need to come up with a table of alternative characters and dynamically generate a regex based on that. For example:
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;
}
...
}
Then for search = 'cao'
this will generate a pattern [cCç][aAãÃá]o
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With