Összedobtam egy egyszerű függvényt, amivel egy megadott szóhoz -val, -vel ragot lehet képezni (pl. alma -> almával). Egyenlőre javascript-ben van megírva, de kérés alapján php-ra is simán átírható. A tévedés jogát fenntartom, ha találtok olyan esetet, amikor nem jól működik, akkor hozzászólásban várom a szót. (lehetséges, hogy valamelyik speciális magánhangzó páros kimaradt a listából) Tehát a függvény:
UPDATE: kód frissítve, köszönet az észrevételekért és a javítási javaslatokért!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | function addWithTermination(word) { var vowels = [ 'a', 'á', 'e', 'é', 'i', 'í', 'o', 'ó', 'ö', 'ő', 'u', 'ú', 'ü', 'ű' ], terminations = { 'val': ['a', 'ae', 'aé', 'ai', 'aí', 'á', 'ái', 'áí', 'o', 'oi', 'ó', 'u', 'ú'], 'vel': ['e', 'ei', 'é', 'i', 'í', 'ö', 'ő', 'ü', 'ű'] }, specialConsonants = [ 'cs', 'gy', 'sz', 'ty', 'zs' ], specialDoubleConsonants = [ 'ccs', 'ggy', 'ssz', 'tty' ], exceptions = { 'val': ['íj', 'híd', 'díj'], 'vel': [] }, lastCharIndex = word.length - 1, lastChar = word[lastCharIndex], vowelsAsString = vowels.join(''), vowelsPattern = new RegExp('[' + vowelsAsString + ']', 'ig'), vowelsMatch = word.match(vowelsPattern), lastTwoVowels = [], lastTwoVowelsAsString, termination; if (exceptions.val.indexOf(word) !== -1) { termination = 'val'; } else if (exceptions.vel.indexOf(word) !== -1) { termination = 'vel'; } else if (vowelsMatch.length > 1) { /* Több magánhagzó van a szóban */ lastTwoVowels.push(vowelsMatch[vowelsMatch.length - 2]); lastTwoVowels.push(vowelsMatch[vowelsMatch.length - 1]); lastTwoVowelsAsString = lastTwoVowels.join(''); if (terminations.val.indexOf(lastTwoVowelsAsString) === -1 && terminations.vel.indexOf(lastTwoVowelsAsString) === -1) { /* A magánhagzó pár nem egy speciális pár */ termination = terminations.val.indexOf(lastTwoVowels[1]) === -1 ? 'vel' : 'val'; } else { /* A magánhagzó pár egy speciális pár */ termination = terminations.val.indexOf(lastTwoVowelsAsString) === -1 ? 'vel' : 'val'; } } else if (vowelsMatch.length === 1) { /* Csak egy magánhangzó van a szóban */ termination = terminations.val.indexOf(vowelsMatch[vowelsMatch.length - 1]) === -1 ? 'vel' : 'val'; } else { /* Ilyen szó nincs */ return word; } if (vowels.indexOf(lastChar) !== -1) { if (vowels.indexOf(lastChar) % 2 === 0) { /* * Az utolsó karakter magánhangzó és ha * nem ékezetes, akkor ékezetessé kell tenni */ word = word.substring(0, lastCharIndex) + vowels[vowels.indexOf(lastChar) + 1]; } } else { if(word[lastCharIndex - 1] !== word[lastCharIndex]) { /* * Az utolsó karakter mássalhangzó, így * ha nem kettős mássalhangzó alapból, * akkor megkell kettőzni */ if(specialConsonants.indexOf(word.substr(lastCharIndex - 1)) !== -1 && specialDoubleConsonants.indexOf(word.substr(lastCharIndex - 2)) === -1) { /* * Az utolsó két karatkter: 'cs', 'gy', 'sz', 'ty' vagy 'zs', * ezeknél az első karaktert duplázzuk */ word = word.substr(0, lastCharIndex) + word[lastCharIndex - 1] + word[lastCharIndex]; } else if(specialDoubleConsonants.indexOf(word.substr(lastCharIndex - 2)) === -1) { word += word[lastCharIndex]; } } /* * Mássalhangzóra végződés esetén mindenképp * törölni kell a -val, -vel ragból a v-t */ termination = termination.substring(1); } word += termination; return word; } |