Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wyrażenia regularne problem
adamp359
post
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 7.06.2012

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


Witam
Mam problem z konstruowaniem wyrażenia regularnego które będzie szukać danego słowa.

  1. $tresc = 'Próby absorpcyjny najbardziej gorąco oczek i dad as';
  2.  
  3. $dane = explode(' ',$tresc);
  4.  
  5. $z = 0;
  6. $ile = count($dane)-1;
  7. for($i = 0; $i<= $ile; $i++)
  8. {
  9. //echo $i;
  10. $slowo = trim($dane[$i]);
  11. if (!empty($slowo))
  12. {
  13. $wartosc = preg_match('/{.*'.$slowo.'.*}/', $synonimy, $out);
  14. print_r($out);
  15. if ($wartosc == 1)
  16. {
  17. $tekssyn .= $out[0].' ';
  18. }
  19. else
  20. {
  21. $tekssyn .= $slowo.' ';
  22. }
  23. }
  24.  
  25. }
  26.  
  27. echo $tekssyn;

Jakie zadanie ma skrypt ze zmiennej $tresc rozbijamy na wyrazy następnie w pętli for sprawdzamy czy dany wyraz znajduje się w pliku txt
dane w pliku txt wyglądają tak: (zmienna $synonimy)

{absolutyzm|monarchiaabsolutna|władzaabsolutna}
{absolwent|wychowanek}
{absorbent|pochłaniacz|substancjapochłaniająca}
{absorber|aparatabsorpcyjny}
{absorbować|asymilować|przyswajać|wchłaniać|frapować|pochłaniać|zajmować|zaprząt
ać}
{absorbując|asymilując|przyswajając|wchłaniając|frapując|pochłaniając|zajmując|z
aprzątając}
{absorbujący|chłonny|wchłaniający}
{absorpcja|pochłanianie|wchłanianie}


Problem polega na tym iż $wartosc = preg_match('/{.*'.$slowo.'.*}/', $synonimy, $out); sprawdza mi czy występuje dany znak lub ciąg na przykład szukamy litery "i" to jeśli w bazie będzie wyżej wyraz "interpretacja" to zostanie on zakwalifikowany. Druga sprawa jeśli skrypt znajdzie już dane słowo w bazie chce aby zamiast niego pojawiło się cały ciąg w klamrach na przykład {absorbujący|chłonny|wchłaniający} (ale to niby działa)

Trzecia sprawa to coś co najbardziej mnie martwi obciążenie serwera podczas szukania słów baza w txt ma prawie 3MB jak rozwiązać ten problem ma ktoś jakiś pomysł za wszystkie sugestie będę bardzo wdzięczny bo morduje się już z tym 3 dni.

Aha próbowałem także takiego wyrażenia regularnego $wartosc = preg_match('/\{.*[\{|\|]'.$slowo.'.*\}/', $synonimy, $out); lecz w tym przypadku znajduje mi tylko wyrazy które zaczynają się na daną literę lub ciąg liter a ja nadal chce konkretnie cały wyraz aby się zgadzał.

Jeszcze raz bardzo proszę o pomoc z góry dzięki.

Ten post edytował adamp359 27.11.2012, 09:31:17
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
cudny
post
Post #2





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

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


Musisz dać zrzut bazy danych gdzieś aby sobie uzupełnić i przeprowadzić testy.
Aby było najwydajniej to warto by pokombinować z zaindexowaniem każdego wyrazu, można spróbować coś takiego - zwiększa to ilość wyrażeń wewnątrz tabeli, ale daje nam pewność szybszego działania.

struktura bazy:
  1.  
  2. id - PRIMARY INDEX
  3. word - UNIQUE INDEX
  4. synonyms - FULL text
  5.  
  6. id | word | synonyms
  7. 1 | absolutyzm | monarchiaabsolutna,władzaabsolutna
  8. 2 | monarchiaabsolutna | absolutyzm,,władzaabsolutna
  9. 3 | władzaabsolutna | absolutyzm,monarchiaabsolutna

  1. $find = 'władzaabsolutna';
  2. $find = mb_strtolower($find);
  3. $query = 'select * from table where word = "'.$find.'" limit 1';
  4.  


jak dostaniesz wynik w tablicy to dajesz:

  1. $result = '{'.str_replace(',','|',$query['synonyms']).'|'.$query['word'].'}';
  2. echo $result;


Można też wszystko zaindexować w pllu full text ale ja nie jestem jednak do końca przekonany do takiego rozwiązania, poza tym działać będzie tylko na silniku myisam, który jest wypierany przez innodb
Jeśli interesuje cię full text search odsyłam do http://www.databasejournal.com/features/my...cle.php/1578331


Z drugiej strony mysql nie jest chyba tutaj najlepszym rozwiązaniem.
Taką strukturę danych jak zaproponowałem można zaimplementować w bazach nosql jak, np. mongodb - myślę, że było by to najfajniejsze rozwiązanie (IMG:style_emoticons/default/smile.gif)

Ten post edytował cudny 27.11.2012, 14:58:25
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: 27.12.2025 - 08:41