Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] zamiana tekstu na link
Forum PHP.pl > Forum > PHP
Maxim74
Piszę sobie taki skrypcik - służący do podmiany fraz w tekście na linki do encyklopedii, która poajwi się na stronie - coś takiego jak na hotscropts.com w opisach skryptów.
Sam w sobie kod jest prosty:
Kod
<?
$text = 'jakiś tam tekst, zawierający linki <a href="http://tekst.pl">tekst</a> ';
$search = array ('tekst', 'teksty');
$replace = array ('<a href="http://adres.url.pl">tekst</a>','<a href="http://adresy.url.pl">teksty</a>');
$display = preg_replace($search, $replace, $text);
return $display;
?>


W związku z tym , że tych definicji większa ilość zrezygnowałem z użycia bazy danych - zastosowałem tablice.
Problem polega na tym, że ten skrypt podmienia również frazy w anchorach oraz w url-ach.
Szukałem długo w necie i właściwie nie znalazłem rozwiązania. Koncepcja sprawdzania czy dana fraza znajduje się w obrębie linku dla każdej znalezionej frazy w tekście dla kolejnych fraz z ciągu jest błędna - skrypt będzie bardzo ciężki.
Przemyslałem sobie sprawę i myślę, że najprostszym rozwiązaniem i najmniej obciążającym parser będzie takie przekształcenie ciągów zawartych pomiędzy <a  i /a>, żeby ich fragmenty poprostu nie znalazły się w obrębie ciągu $search. Wymysliłem, że wystarczy w obrębie <a i /a> wstawić co drugi znak £, nastepnie wykonać w/w kod podmiany, a nastepnie z pomiędzy tagów <a /a> usunąć wszystkie znaki £.
Tylko jak to zrobić ? Bardzo prosze o pomoc w skodowaniu tego fragmentu modyfikacji ciągu pomiędzy <a i /a>.
sobieh
Pisane na szybko więc nie wiem czy działa 100% poprawnie i czy jest wydajne ... ale to pierwsze co mi przyszło do głowy tongue.gif
  1. <?
  2.  
  3. function simple_encode ( $matches )
  4. {
  5. for ( $i = 0 ; $i < strlen($matches[1]) ; $i ++ )
  6. {
  7. $out .= chr(ord($matches[1]{$i}) ^ 0x80);
  8. }
  9. return "<LINK>$out</LINK>";
  10. }
  11.  
  12. function simple_decode ( $matches )
  13. {
  14. for ( $i = 0 ; $i < strlen($matches[1]) ; $i ++ )
  15. {
  16. $out .= chr(ord($matches[1]{$i}) ^ 0x80);
  17. }
  18. return "<a$out/a>";
  19. }
  20.  
  21.  
  22. $test = "Jakis tam test1 zawierajacy test2 linki <a href='test1.htm'>test2</a>";
  23. $search = array ( "#(test1)#si" , "#(test2)#si" );
  24. $replace = array ( "<a href=\"http://strona1.pl\">1</a>" , "<a href=\"http://strona2.pl\">1</a>" );
  25.  
  26.  
  27. // ZAMIENIASZ WSZYSTKIE LINKI W TEKSCIE NA ZAKODOWANE POMIEDZY <LINK></LINK> (takie bbcode tongue.gif)
  28. // ZAKODOWANE DLATEGO ZEBY SZUKANE SLOWO NIE WYSTEPOWALO NP. W ADRESIE W LINKU
  29. $test = preg_replace_callback ( "#<a(.*?)/a>#si" , simple_encode , $test );
  30.  
  31. // ZAMIENIASZ SWOJE TEKSTY NA LINKI
  32. $test = preg_replace ( $search , $replace , $test );
  33.  
  34. // ZAMIENIASZ SPOWROTEM TO CO ZAKODOWAŁEŚ NA LINKI
  35. $test = preg_replace_callback ( "#<LINK>(.*?)</LINK>#si" , simple_decode , $test );
  36. echo $test;
  37.  
  38. ?>
Maxim74
Dzięki działa
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.