Diskuze: detekce diakritiky v javascriptu
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj a jak přesně by sis to představoval?
Když jsi ten problém trochu rozebereš, tak máš v podstatě nějaký text, který obsahuje nějaké znaky a ty chceš zjistit, jestli jsou to znaky z nějaké konkrétní skupiny a případně kolik jich je. Takže nemáš moc na výběr než to vzít znak po znaku a porovnávat ho s tou dotyčnou skupinou, která Tě zajímá.
Z toho plyne následující:
A teď se trochu liší konkrétní postupy, jaké můžeš zvolit. Mě napadají asi 3 řešení:
Tohle je tedy nějaký nástřel různých způsobů, jak to řešit, třeba
Tě napadne ještě nějaký jiný, ale základní princip bude pořád stejný.
https://mlich.zam.slu.cz/wys4.htm
Mam tam kod na odstraneni diakritiky. Staci si to jen upravit.
function patternReplace(reg,repl,str)
{
//reg[0] = reg[0].replace(/([\!\$\(\)\*\+\.\/\:\=\?\[\\\]\^\{\|\}])/g,"\\$0");
reg = new RegExp(reg[0],reg[1]);
//alert(str)
alert(reg.test(str) ? "Match" : "No match");
return str.replace(reg,repl);
}
function odstranDiakritiku(str1)
{
var i,j, str2;
str2 = '';
for(i = 0; i < str1.length; i++)
{
j = DIAKRITIKA[0].indexOf(str1.charAt(i));
if (j!==-1)
{
str2 += DIAKRITIKA[1].charAt(j);
}
else {
str2 += str1.charAt(i);
}
}
return str2;
}
function textToFileName(str)
{
return odstranDiakritiku(str).toLowerCase().replace(new RegExp('[^a-z0-9]+','g'),'_').replace(new RegExp('(^_)|(_$)','g'),'');
}
var DIAKRITIKA = [
"áäčďéěíĺľňóôöŕšťúůüýřžÁÄČĎÉĚÍĹĽŇÓÔÖŔŠŤÚŮÜÝŘŽ",
"aacdeeillnooorstuuuyrzAACDEEILLNOOORSTUUUYRZ"
];
A bylo by to rychlejsi, kdybys ten cyklus napsal takto:
var i,j, str2, end;
str2 = '';
end = str1.length;
for(i = 0; i < end; i++)
Ja by som len k Petrovmu kódu dodal, že na prevod, na nahrádzanie znakov je tu regex funkcia replace vďaka ktorej ide výmenu znakov napísať jednoducho, krátko, zrozumiteľne a bez cyklov:
const latin_map = {
'á': 'a',
'Á': 'A',
'ä': 'a',
'Ä': 'A',
'å': 'a',
'Å': 'A',
/* atď */
}
function toBasicLatin (str, map) {
return str.replace(/[^A-Za-z]/g, x => map[x] || x)
}
/* test */
console.log(toBasicLatin('ÅpätÁr', latin_map)) // vypíše ApatAr
Ešte by som dodal, že štandard Unicode má definovanú tabuľku pre dekompozíciu znakov s diakritikou. A JS má novú metódu na normalizáciu stringov podľa tejto tabuľky. Pomocou tejto dekompozície, čiže rozdelení znakov s diakritikou na znaky bez diakritiky a zvlášť diakritické znamienka, a pomocou následného vymazania iba týchto diakritických znamienok, ide napísať univerzálna funkcia na odstránenie diakritiky z textov:
function toBasicLatin (str) {
return str
.normalize('NFD')
.replace(/[\u0300-\u036F]/g, '')
}
console.log(toBasicLatin('ĀçõĎżűşęï')) // vypíše AcoDzusei
Čo sa týka kompatibility, tá je uvedená TU
Zobrazeno 6 zpráv z 6.