Леший Posted September 10, 2010 Report Share Posted September 10, 2010 (edited) Štukoju par vienu funkciju: Ir 2 rindas $source un $dest. Vajag atrast masīvu ar patterniem, replacementiem un limitu, lai no pirmas rindas dabūtu otro, izmantojot masīvu, kā parametrus iekš preg_replace(). Piemērs: $source = "Šodien ir siltā diena, rīt būs siltāk."; $dest = "Šodien ir aukstā diena, rīt būs siltāk."; Vajadzīgs rezultāts ir: array( 0=>array( 'pattern' => '/sil/', 'replacement' => 'auks', 'limit'=>1 ) ); Varbūt ir kādas idejas? Rezultātam ir jābūt pēc iespējas optimālam. EDIT: Jādarbojās teksta līmenī, nevis vārdu līmenī, tas ir: $source = "Šodien ir siltā diena, rīt būs siltāk."; $dest = "Šodien ir aukstā nakts, rīt būs siltāk."; rezultātam ir jābūt: array( 0=>array( 'pattern' => '/siltā diena/', 'replacement' => 'aukstā nakts', 'limit'=>1 ) ); nevis array( 0=>array( 'pattern' => '/sil/', 'replacement' => 'auks', 'limit'=>1 ), 1=>array( 'pattern' => '/diena/', 'replacement' => 'nakts', 'limit'=>1 ), ); Edited September 10, 2010 by Леший Quote Link to comment Share on other sites More sharing options...
viena tante Posted September 10, 2010 Report Share Posted September 10, 2010 a nevar abas rindas salikt pa massīviem un pēctam salidzināt elementus, nevienādos tad arī atlasīt Quote Link to comment Share on other sites More sharing options...
Леший Posted September 10, 2010 Author Report Share Posted September 10, 2010 Tas variants der REPLACE tipa izmaiņam, bet, ja ir INSERT vai DELETE, tad jau grūtāk. Quote Link to comment Share on other sites More sharing options...
bubu Posted September 10, 2010 Report Share Posted September 10, 2010 Lai atrastu optimālāko variantu tur nebūs viss tik triviāli. Jālasa kautkas šitāds: http://en.wikipedia.org/wiki/String-to-string_correction_problem Pameklē algoritmus no Bioinformātikas lauciņa, kas apstrādā DNS sekvences. Tiem šitāda veida algorimi (divu stringu salīdzināšana/izlīdzināšana/mainīšana) ir ļoti izpētīti un plaši pielietoti. http://en.wikipedia.org/wiki/Sequence_alignment http://en.wikipedia.org/wiki/Needleman-Wunsch_algorithm http://en.wikipedia.org/wiki/Smith-Waterman_algorithm http://en.wikipedia.org/wiki/BLAST Quote Link to comment Share on other sites More sharing options...
Леший Posted September 10, 2010 Author Report Share Posted September 10, 2010 bubu, par string to string correction jau diezgan labi esmu salasījies, un levenšteina distanci izmantoju bieži. Šoreiz interesē process, līdzīgs levenšteinam, tikai, lai atgriež nevis pašu distanci, bet pašus operandus un operācijas. Paprovēšu pašu levenšteina algoritmu adoptēt. Quote Link to comment Share on other sites More sharing options...
Леший Posted September 15, 2010 Author Report Share Posted September 15, 2010 Nu pagaidam šāds variants: $source = "Šodien ir siltā diena, rīt būs daudz siltāk."; $dest = "Šodien ir ļoti aukstā diena, rīt būs siltāk."; $source_arr = preg_split('/ /u', $source, -1, PREG_SPLIT_NO_EMPTY); $dest_arr = preg_split('/ /u', $dest, -1, PREG_SPLIT_NO_EMPTY); $delete = array_diff($source_arr, $dest_arr); $insert = array_diff($dest_arr, $source_arr); $replace = array_intersect_key($insert, $delete); $delete = array_diff_key($delete, $replace); $insert = array_diff_key($insert, $replace); Nav regex patterni, bet it kā der. Vēl jāustaisā salīmēšanu vienā mainīgā, ja ir 2 pēc kartas vārdi vienā masīvā, piemēram [2]=>'asd', [3]=>'qwe' --> [2]=>'asd qwe' Kādi būs ieteikumi optimizācijai? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.