mai-jal-la ei ol-lut ko-ti-a ko-ko i-ka-naan nai-mi-sis-sa-kin o-li han ol-lut yh-ta ko-dit-to-man pie-tin kans-sa jo-ka nel-jan vuo-den pe-ras-ta kuol-les-saan jat-ti mai-jan kau-laan kak-si a-las-ton-ta ja tur-va-ton-ta las-ta
1. Konsonanttisääntö: Jos tavuun kuuluvaa vokaalia seuraa yksi tai useampia konsonantteja, joita vielä seuraa vokaali, tavuraja sijoittuu välittömästi ennen viimeistä konsonanttia.
2. Vokaalisääntö: Jos tavun ensimmäistä vokaalia seuraa toinen vokaali, niiden väliin tulee tavuraja, ellei
a) edellinen vokaali ole sama kuin jälkimmäinen (pitkä vokaali).
b) jälkimmäinen vokaali ole i (i:hin loppuva diftongi).
c) kysymyksessä ole jokin vokaalipareista au, eu, ie, iu, ou, uo, yö, äy, öy, ey tai iy (muu diftongi).
3. Diftongisääntö: Jos tavun kuuluvaa diftongia tai pitkää vokaalia seuraa vokaali, tähän väliin tulee aina tavuraja.
4. Poikkeussääntö: Yhdyssanat jaetaan tavuihin sanojen välistä, myös siinä tapauksessa, että sana on yhdyssana vain alkuperäiskielessä.
Koodi. Jos käytät, propsit mulle.
<?php /** * tavuta sana * @param string $str - lause * @return array - two dimentional array */ function tavuta ( $str ){ // first remove unwanted chars $str = str_replace (array( "." , "," , "!" , "\"" , "'" , ";" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "0" , ":" ), "" , $str ); $p = explode ( " " , $str ); for( $k = 0 ; $k <= count ( $p ); $k ++){ $sana = trim ( $p [ $k ]); $a = tavut ( $sana ); $result [] = $a ; } return $result ; } /** * return array */ function tavut ( $sana ){ $kons = array( "b" , "c" , "d" , "f" , "g" , "h" , "j" , "k" , "l" , "m" , "n" , "p" , "q" , "r" , "s" , "t" , "v" , "w" , "x" , "z" ); $voka = array( "a" , "e" , "i" , "o" , "u" , "y" ); // diftongit $dif = array( "yi" , "ui" , "oi" , "ai" , "ay" , "au" , "yo" , "oy" , "uo" , "ou" , "ie" , "ei" , "eu" , "iu" , "ey" , "iy" ); $sana = trim ( $sana ); // utf stuff. a:ksi ja o:ksi $sana = str_replace (array( "å" , "ä" , "ö" , "Å" , "Ä" , "Ö" ), array( "a" , "a" , "o" , "a" , "a" , "o" ), $sana ); $loop = strlen ( $sana ); // split the word $w = str_split ( strtolower ( $sana )); $w [] = " " ; // helpers so we dont get notice's $w [] = " " ; $w [] = " " ; $w [] = " " ; // put the word here letters and -'s $com_word = array(); for( $i = 0 ; $i < $loop ;){ $d = 1 ; // how many digits forward if( in_array ( $w [ $i ], $kons )){ if(( $i + 1 ) >= $loop ){ // if last is kons, remove the possible previous - $last = array_pop ( $com_word ); if( $last != "-" ){ $com_word [] = $last ; } } $com_word [] = $w [ $i ]; } else if( in_array ( $w [ $i ], $voka )){ $com_word [] = $w [ $i ]; if( in_array ( $w [ $i ]. $w [ $i + 1 ], $dif ) || $w [ $i ] == $w [ $i + 1 ] || $w [ $i + 1 ] == "i" ){ // next diftongi, same vokaali or "i" $com_word [] = $w [ $i + 1 ]; $d = 2 ; if( in_array ( $w [ $i + 2 ], $voka )){ $com_word [] = "-" ; } else if( in_array ( $w [ $i + 2 ], $kons ) && in_array ( $w [ $i + 3 ], $kons ) && in_array ( $w [ $i + 4 ], $kons )){ $com_word [] = $w [ $i + 2 ]; $com_word [] = $w [ $i + 3 ]; $com_word [] = "-" ; $d = 4 ; } else if( in_array ( $w [ $i + 2 ], $kons ) && in_array ( $w [ $i + 3 ], $kons )){ $com_word [] = $w [ $i + 2 ]; $com_word [] = "-" ; $d = 3 ; } else if( in_array ( $w [ $i + 2 ], $kons )){ $com_word [] = "-" ; $d = 2 ; } } else if( in_array ( $w [ $i + 1 ], $voka )){ $com_word [] = "-" ; $d = 1 ; } else { if( in_array ( $w [ $i + 1 ], $kons ) && in_array ( $w [ $i + 2 ], $kons ) && in_array ( $w [ $i + 3 ], $kons )){ $com_word [] = $w [ $i + 1 ]; $com_word [] = $w [ $i + 2 ]; $com_word [] = "-" ; $d = 3 ; } else if( in_array ( $w [ $i + 1 ], $kons ) && in_array ( $w [ $i + 2 ], $kons )){ $com_word [] = $w [ $i + 1 ]; $com_word [] = "-" ; $d = 2 ; } else if( in_array ( $w [ $i + 1 ], $kons )){ $com_word [] = "-" ; $d = 1 ; } } } $i = $i + $d ; } // now build the word back together $tavut = array(); $tindex = 0 ; foreach( $com_word AS $in => $kirjain ){ if( $kirjain == "-" ){ $tindex ++; } else if(isset( $tavut [ $tindex ])){ $tavut [ $tindex ] .= $kirjain ; } else { $tavut [ $tindex ] = $kirjain ; } } return $tavut ; } /** * return haiku 5-7-5 * @param array $lause valmiiksi tavutettu lause (tämä tulee tavuta-funkkarista) * @param array $original sama ääkkösillä explode(" ", orig) * @return string haiku */ function isHaiku ( $lause , $original ){ // laske sanojen tavut tähän $a = array(); for( $i = 0 ; $i < count ( $lause ); $i ++){ $a [] = count ( $lause [ $i ]); } // onko haiku löytynyt $found = false ; // aloituspiste for( $i = 0 ; $i < count ( $a ); $i ++){ // haiku tulokset $result1 = "" ; $result2 = "" ; $result3 = "" ; // näiden countit pitää olla 5-7-5 $w1 = array(); $w2 = array(); $w3 = array(); // alkupisteestä etiäpäin for( $j = $i ; $j < count ( $a ); $j ++){ if( array_sum ( $w1 ) < 5 && isset( $original [ $j ])){ // jos vähemmän kuin 5 $w1 [] = $a [ $j ]; $result1 .= trim ( $original [ $j ]). " " ; } else if( array_sum ( $w2 ) < 7 && isset( $original [ $j ])){ // jos vähemmän kuin 7 $result2 .= trim ( $original [ $j ]). " " ; $w2 [] = $a [ $j ]; } else if( array_sum ( $w3 ) < 5 && isset( $original [ $j ])){ // jos vähemmän kuin 5 $result3 .= trim ( $original [ $j ]). " " ; $w3 [] = $a [ $j ]; } else if( array_sum ( $w1 ) == 5 && array_sum ( $w2 ) == 7 && array_sum ( $w3 ) == 5 ){ // onko tulos haiku $found = true ; $i = count ( $a ); $j = count ( $a ); } else { // nollaa tulos $w1 = array(); $w2 = array(); $w3 = array(); } } } $result = "" ; if( $found ){ $result = $result1 . "/\n" . $result2 . "/\n" . $result3 . "" ; // print '<pre>'; // print_r ( $a ); // print_r ( $w1 ); // print_r ( $w2 ); // print_r ( $w3 ); // print '</pre>'; } return $result ; } ?>