Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] zamiana całych wyrazów pobranych z bazy - problem, tworzenie linków z wyrazów pobranych z bazy
damians1
post
Post #1





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

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


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
starr
post
Post #2





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 16.10.2007

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


$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
Go to the top of the page
+Quote Post
damians1
post
Post #3





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

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


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ć?
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 05:52