Jump to content
php.lv forumi

Atrast replace patternu, salīdzinot 2 rindas


Леший

Recommended Posts

Š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 by Леший
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...