Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] zamiana tekstu na link, jak wykluczyć już istniejące linki z reguły
Maxim74
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 12.09.2007

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


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>.
Go to the top of the page
+Quote Post
sobieh
post
Post #2





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 28.10.2004

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


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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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. ?>
Go to the top of the page
+Quote Post
Maxim74
post
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 12.09.2007

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


Dzięki działa
Go to the top of the page
+Quote Post

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: 24.08.2025 - 00:54