Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] szukanie frazy w frazie
hhg
post
Post #1





Grupa: Zarejestrowani
Postów: 316
Pomógł: 0
Dołączył: 5.07.2006

Ostrzeżenie: (0%)
-----


prosze nie pytajcie dlaczego nie korzystam ze strstr(), nie ja to wymyslalem (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Mam napisac program ktory szuka jednej frazy ($search) w innej frazie ($belt). Ma szukac w nastepujacy sposob: przechodzi po znakach z $belt, jezeli dany znak z $belt pokrywa sie ze pierwszym z $search to przechodzi ze stanu 0 w stan 1 i sprawdza kolejny. Jezeli sie zgadza to przechodzi w stan 2 itd. Logicznym jest ze jezeli nr stanu jest rowny dlugosci $search to napis zostal znaleziony. Jest jeszcze znak * wystepujacy w $search ktory zastepuje kazdy inny, czyli w jego wypadku automatycznie przechodzimy w stan wyższy.

Mam jednak powien problem bo moj program dziala nie dla wszystkich przypadków.

Oto kod:

  1. <?php
  2.  
  3. function stringtoarray($string){
  4. $len = strlen($string);
  5.  
  6. $cur = 0;
  7.  
  8. $characterarray = array();
  9.  
  10. while($cur < $len){
  11. $char = $string{$cur};
  12. array_push($characterarray,$char);
  13. $cur = $cur + 1;
  14. }
  15.  
  16. return $characterarray;
  17. }
  18.  
  19.  
  20. $belt = stringtoarray('ala ma kota');
  21. $search = stringtoarray('m*');
  22. $table = array();
  23.  
  24. for ($j=0; $j<count($search); $j++)
  25. for ($i=0; $i<count($belt); $i++)
  26. $table[$j][$i] = 0;
  27.  
  28. $j = 0;
  29.  
  30. for ($i=0; $i<count($belt); $i++) {
  31.  
  32. echo '- porownanie belt[' . $i . '] = ' . $belt[$i] . ', search[' . $j . '] = ' . $search[$j];
  33.  
  34. if ($belt[$i] == $search[$j] || $search[$j] == '*') {
  35. $j++;
  36. } else {
  37. if ($j) $j--;
  38. }
  39.  
  40.  
  41. echo ' stan ' . $j . '<br />';
  42. $table[$j-1][$i] = $j;
  43.  
  44. if ($j == count($search)) {
  45. echo 'znaleziono napis!<br />';
  46. $j = 0;
  47. }
  48.  
  49. if ($j) echo '<br />';
  50. }
  51.  
  52.  
  53. echo '<br /><br />tablica przejsc: <br />nr poszczegolnych znakow / stany';
  54. for ($j=0; $j<count($search); $j++) {
  55. echo '<div style="float:left;"><pre>';
  56. var_dump($table[$j]);
  57. echo '</pre></div>';
  58. }
  59.  
  60. ?>


teraz pięknie znajdzie 'm*' jako 'ma'

na samym dole wygeneruje tablice przejsc, ale nas to nie obchodzi.

Niestety nie działa to dla przypadku np.

$belt = 'alaalaalaalab';
i
$search = 'alab';

dlaczego? jak to poprawić? sa jakies inne dla ktorych nie zadziała?

prosze o pomoc
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
hhg
post
Post #2





Grupa: Zarejestrowani
Postów: 316
Pomógł: 0
Dołączył: 5.07.2006

Ostrzeżenie: (0%)
-----


da sie jeszcze ten kod jakkolwiek (doslownie jakkolwiek ) zoptymalizowac?
  1. <?php
  2.  
  3. function str_find($search, $belt) {
  4.  
  5. $offset = 0;
  6. $success = strlen($search);
  7. $stop = strlen($belt);
  8. $remember = null;
  9.  
  10.  
  11.  
  12. for($i=0; $i < $stop; $i++)
  13. if(($search{$offset} == $belt{$i}) or ($search{$offset} == '*')) {
  14.  
  15.  
  16.  
  17. echo 'stan ' . ($offset + 1) . '<br />';
  18.  
  19. if(++$offset == $success) {
  20.  
  21. return $i;
  22. }
  23.  
  24. } else {
  25. $i -= $offset;
  26. $offset = 0;
  27. }
  28.  
  29. return -1;
  30. }
  31.  
  32. if($ile = str_find('akjkhkj', 'alaalaalaalab') >= 0)
  33. echo 'Znaleziono!';
  34. else
  35. echo 'Nie znaleziono!';
  36.  
  37. ?>
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 10.10.2025 - 23:19