Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] zamiana całych wyrazów pobranych z bazy - problem
Forum PHP.pl > Forum > PHP
damians1
Chce zamienić w dowolnym tekście na linki wszystkie wyrazy które znajdują sie w słowniku (pobierane z bazy), ważne jest aby tworzyło linki tylko z całych wyrazów inaczej problemu by nie było.
Mam w słowniku kilkaset wpisów i przykładowo znajduje sie tam wyraz dom, chce żeby zamieniało w zdaniu tylko całe wyrazy nie może zamienić część znaków na link np. w wyrazach domek, domowy, domofon, domino itd. Ma zamieniać również wyrazy bez względu na wielkość znaków.

Skrypt działa tak pobieram słowa z bazy i lecę pętlą - tu problemu nie ma
następnie tworze linka na podstawie tytułu i opis - tu tez ok.
Problem natomiast jest przy zamianie funkcją str_ireplace() problemu by nie było gdyby każdy wyraz otaczały spacje ale tam znajdują sie przecinki kropki nawiasy kod html i inne znaki.
Próbowałem to zrobić za pomocą preg_replace() oraz [^[:alnum:]] i wszystko jest ok gdy w wyrażeniu znajduje sie text statyczny, gorzej ze musi tam sie znaleźć również zmienna a wtedy wywala mi błędy. nie wiem jak sobie z tym poradzić, wiec na razie stosuje kilka wywołań str_ireplace() ale to chyba dobry pomysł nie jest ze względu na wydajność a i tak parę kombinacji znaków sobie darowałem

Oto mój kod:
  1. <?php
  2. foreach ($slownik as $rec) {
  3.  
  4. $rec['Desc'] = str_ireplace($rec['Title'], '', $rec['Desc']);
  5. $rec['Desc'] = substr($rec['Desc'], 0, 125);
  6.  
  7. $a = '<a href="slownik#,#' . substr($rec['Id'], 0, 1) . '#,#' . $rec['Id'] . '#.#html" title="' . $rec['Desc'] . '">' . $rec['Title'] . '</a>'; 
  8.  
  9. $result['data'][0]['Desc'] = str_ireplace(' '.$rec['Title'].' ', ' '.$a.' ', $result['data'][0]['Desc']); 
  10. $result['data'][0]['Desc'] = str_ireplace(' '.$rec['Title'].'.', ' '.$a.'.', $result['data'][0]['Desc']);
  11. $result['data'][0]['Desc'] = str_ireplace(' '.$rec['Title'].',', ' '.$a.',', $result['data'][0]['Desc']); 
  12. $result['data'][0]['Desc'] = str_ireplace(' '.$rec['Title'].'?', ' '.$a.'?', $result['data'][0]['Desc']); 
  13. $result['data'][0]['Desc'] = str_ireplace(' '.$rec['Title'].')', ' '.$a.')', $result['data'][0]['Desc']); 
  14. $result['data'][0]['Desc'] = str_ireplace(' '.$rec['Title'].'<', ' '.$a.'<', $result['data'][0]['Desc']);
  15. $result['data'][0]['Desc'] = str_ireplace(' '.$rec['Title'].'/', ' '.$a.'/', $result['data'][0]['Desc']); 
  16. $result['data'][0]['Desc'] = str_ireplace(' '.$rec['Title'].''', ' '.$a.''', $result['data'][0]['Desc']);
  17. $result['data'][0]['Desc'] = str_ireplace('>'.$rec['Title'].' ', '>'.$a.' ', $result['data'][0]['Desc']); 
  18. $result['data'][0]['Desc'] = str_ireplace('>'.$rec['Title'].'.', '>'.$a.'.', $result['data'][0]['Desc']);
  19. $result['data'][0]['Desc'] = str_ireplace('>'.$rec['Title'].',', '>'.$a.',', $result['data'][0]['Desc']); 
  20. $result['data'][0]['Desc'] = str_ireplace('>'.$rec['Title'].'<', '>'.$a.'<', $result['data'][0]['Desc']); 
  21. $result['data'][0]['Desc'] = str_ireplace('('.$rec['Title'].')', '('.$a.')', $result['data'][0]['Desc']); 
  22. }
  23. $result['data'][0]['Desc'] = str_replace("#,#", ",", $result['data'][0]['Desc']); 
  24. $result['data'][0]['Desc'] = str_replace("#.#", ".", $result['data'][0]['Desc']);
  25. ?>


Chciałbym wiedzieć jak to zadanie zrealizować za pomocą wyrażeń regularnych lub chociaż jak zoptymalizować ten mój skrypt by po dodaniu jeszcze kilku znaków działało wydajnie.
Niestety szukałem rozwiązania na tym i na wielu innych forach i nie znalazłem
Z góry dzięki za pomoc
starr
$slowo1 ='/('.$slowo.'){1}/';
$slowo2 = '<a href="">slowo</a>;
$tekst = preg_replace($slowo1, $slowo2, $tekst);

$slowo pobierasz ze swojej bazy, jeśli jest ich więcej to w pętli

starr
-------------------------------------
www.aleproste.pl
damians1
Cytat(starr @ 18.10.2007, 20:47:36 ) *
$slowo1 ='/('.$slowo.'){1}/';
$slowo2 = '<a href="">slowo</a>;
$tekst = preg_replace($slowo1, $slowo2, $tekst);

$slowo pobierasz ze swojej bazy, jeśli jest ich więcej to w pętli

starr
-------------------------------------
www.aleproste.pl

niestety ten kod nie działa u mnie, zwraca następujący bład:
Warning: preg_replace() [function.preg-replace]: Unknown modifier 'N' in G:\aminet\dokumenty\damian\slowniki\index.php on line 69

to samo gdy stosowałem preg_replace() z wyrażeniem [^[:alnum:]]
Co jest nie tak? ma ktoś pomysł jak to rozwiązać?
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.