htio bih napraviti funkciju koja će detektirati tip felere.
Volio bih se čim više osloniti na regexp, no po potrebi djelomično mogu rješiti stvar i if, else logikom.
Algoritam bi trebao razmišljati na sljedeći način, recimo imamo tekst:
“Danas je lijep sunčan dan”
Koji može biti napisan tipa:
“Danas je lijep sučan dan”
“Danas je lijep sučnan dan”
“Danas je lijep sumčan dan”
Znači, pretpostavka je da tip feler ili guta jedno slovo, ili zamjenjuje dva susjedna slova, ili krivo piše jedno slovo.
S time da bi volio imati varijantu regularnog izraza koja traži da prvo i zadnje slovo moraju biti točno napisana, i varijanta koja bi trpila da je i prvo ili zadnje slovo ispušteno, flipano ili krivo napisano.
Puno hvala na bilo kakvoj pomoći.
Ne trebam dobiti gotov izraz/e, značilo bi mi i da dobijem nekakve hintove.
Našao sam ovako jedan komentar unutar te check funkcije:
// Build the full regular expressions for each compound rule.
// I have a feeling (but no confirmation yet) that this method of
// testing for compound words is probably slow.
hehe,
čini mi se da je lik isto svoja pravila rješava sa if else logikom, te da je svjestan da bi moglo brže s regularnima. Osim komentara, nisam primjetio nešto regularnih…
Ja bi volio da ako netko ima ikakvu ideju kako bi se pojedini djelovi mog upita rješili sa regularnim, da probamo. Pa da putem nešto i naučimo
Možemo gornji upit razbiti na tri spomenuta pravila…i dodati četvrto koje zaboravih:
1.pravilo: "nedostajuće slovo"
2.pravilo: "flipana slova"
3.pravilo: "krivo slovo"
4.pravilo: “višak slovo” ->to bi bila rečenica: “Danas je lijep sunčaln”
Eto, ja ću nabadati ovdje s regularnim “pokušajevima” za pojedino pravilo, a ako itko osjeti da mi može dati dobar hint na što da se osvrnem…i s čim bi mogao kvalitetnije pristupiti rješavanju problema, neka sugestira!
(neka promatrana riječ bude “dan”)
-nedostajuće slovo:
//example: string=replaceTipFeler('beograd+(a|u)?',string,{block:'biograd(a|u)?',onZamjena:function(zamjena,match){}});
function replaceTipFeler(word,string,f)
{
if(!f)var f={};
var globalReplace='g';
var caseSensitive='i';
if(isset(f.caseSensitive)) caseSensitive= f.caseSensitive ? '':'i';
var data=word.split('+');
word=data[0];
var sufix=data.length>1 ? data[1] : '';
var replacer=function(match, offset)
{
if(f.block) //block je regularni izraz upit koji se uspoređuje sa pronađeim tipfelerom. Ako block odgovara tipfeleru, zamjena će biti blokirana!
{
var patt2=new RegExp(f.block,'gi');
var blockedZamjena=match.match(patt2);
if(blockedZamjena && blockedZamjena[0].length==match.length)return match;
}
if(sufix) //recimo zadan word je: "beograd+(a|u)?" , ova kontrola sprijecava da se napravi zamjena beograda->beograd
{
var patt2=new RegExp(word+sufix,'gi');
var blockedZamjena=match.match(patt2);
if(blockedZamjena && blockedZamjena[0].length==match.length)return match;
}
if(match==word)return word;
if(f.onZamjena)f.onZamjena(word,match);
return word;
}
var search=function(patern,rule)
{
var patt=new RegExp("\\b("+patern+")"+sufix+"\\b",globalReplace+caseSensitive);
string=string.replace(patt, replacer);
}
//1.nedostajuce slovo: (d?an|da?n|dan?)
var patern=[];
for(var x=0;x<word.length;x++)patern.push(word.substring(0,x)+word.substring(x+1));
search(patern.join('|'),'nedostajuce slovo');
//2.krivo slovo: (\wan|d\wn|da\w)
var patern=[];
for(var x=0;x<word.length;x++)patern.push(word.substring(0,x)+'\\w'+word.substring(x+1));
search(patern.join('|'),'krivo slovo');
//3. visak slovo: (d\wan|da\wn)
var patern=[];
for(var x=0;x<word.length-1;x++)patern.push(word.substring(0,x+1)+'\\w'+word.substring(x+1));
search(patern.join('|'),'visak slovo');
//4. fliped slova
var patern=[];
for(var x=0;x<word.length-2;x++)patern.push(word.substring(0,x+1)+word.charAt(x+2)+word.charAt(x+1)+word.substring(x+3));
search(patern.join('|'),'fliped');
return string;
}