Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa] Wyszukiwanie
Forum PHP.pl > Inne > Oceny
Athlan
Potrzebuję skryptu który przeanalizuje dane wpisane w pole wyszukiwarki, np szukanie:

wystap słowo "wystap fraza" -"ale nie ta" -nieto

słowa "wystap" i "slowo" powinny wystappic, tak samo z "wystap fraza". Pojawienie się znaku minusa przed frazą lub wyrazem powoduje, że kryterium ogranicza ich użycie w tekście.

Naskrobałem coś takiego, pewnie można to zorbić lepiej, ale poddaje poniższy kod do lustracji:
http://rafb.net/p/NaCstX35.html

Pozdrawiam smile.gif
tiraeth
The requested document was not found biggrin.gif

Wyszukiwanie nie działa, bo dokumentu nie znaleziono winksmiley.jpg

1/10
Athlan
Zamieszcze bezpośrednio ;]

  1. <?php
  2.  
  3. class Vframe_Util_Search
  4. {
  5. protected $_aFields = array();
  6.  
  7. public function __construct(array $aFields)
  8. {
  9. $this->_aFields = $aFields;
  10. }
  11.  
  12. public function LookUp($sString)
  13. {
  14. $aQueryAdd = array();
  15. $aQueryNot = array();
  16.  
  17. // get all pharses with can't be found
  18. preg_match_all('/-"(.*?)"/', $sString, $aPharsesDebar);
  19. // pharses with should be found
  20. preg_match_all('/[^-]"(.*?)"/', $sString, $aPharsesLike);
  21.  
  22. // escape pharses from string and get all words
  23. $aItems = explode(' ', preg_replace('/-?"(.*?)"/', '', $sString));
  24.  
  25. foreach($aPharsesLike[1] as $sPharse)
  26. $aItems[] = $sPharse;
  27.  
  28. foreach($aPharsesDebar[1] as $sPharse)
  29. $aItems[] = '-' . $sPharse;
  30.  
  31. foreach($aItems as $sItem)
  32. if(($sItem = trim($sItem)))
  33. {
  34. $aElement = array();
  35. $bLike = true;
  36.  
  37. // minus character means it can't be found
  38. if(ereg('^-', $sItem))
  39. {
  40. $sItem = substr($sItem, 1);
  41. $bLike = false;
  42. }
  43.  
  44. foreach($this->_aFields as $sField)
  45. {
  46. $sElement = '`' . $sField . '` ' . ((!$bLike) ? 'NOT ' : '') . 'LIKE "%' . $sItem . '%"';
  47.  
  48. if($bLike)
  49. $aQueryAdd[] = $sElement;
  50. else
  51. $aQueryNot[] = $sElement;
  52. }
  53. }
  54.  
  55. $aQuery = array();
  56.  
  57. if(count($aQueryAdd))
  58. $aQuery[] = implode(' OR ', $aQueryAdd);
  59.  
  60. if(count($aQueryNot))
  61. $aQuery[] = implode(' AND ', $aQueryNot);
  62.  
  63. return implode(' AND ', $aQuery);
  64. }
  65. }
  66.  
  67. $oSearch = new Vframe_Util_Search(array('news_title', 'news_content'));
  68. echo $oSearch->LookUp('wystap słowo "wystap fraza" -"ale nie ta" -nieto');
  69.  
  70. ?>
stoprocent
A nie latwiej uzyc MATCH AGAINST w BOOLEAN MODE ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.