Pomoc - Szukaj - U¿ytkownicy - Kalendarz
Pe³na wersja: [php]funkjca weryfikujaca dane z formularza - problem
Forum PHP.pl > Forum > PHP
stal-sw
Witam.
Ponizej mam funkcje, przez ktora przepuszczam wszytkie dane z formularzy TEXTAREA.
Najwazniejsze w nije ejst to ze kroi dlugie wyrazy (powyzej 50 znakow). I tutaj jest duzy problem, z czescia mojej funkcji, gdzie jest wykrywany i tworzony LINK.
Mianowice jak link jest dluzszy niz te 50 znakow to niestety ale adres strony (LINK) bedzie uciety - a dokladnie po 50 znakach ebdzie wstawiona spacja.
Jak sobei z tym oradzic aby linki nie byly obcinane, a reszta slow byla przycinana do dlugosci 50 znakow (przycinana czyli po 50 znakach bedzie postawiona SPACJA a po niej oczywcie ebdzi dlasza czesc slowa). ?

Z gory dzieki za pomoc.

  1. <?
  2. function verify_form($txt){
  3. $txt = strip_tags($txt); //usuwa tagi
  4. $txt = addslashes($txt);
  5. $txt = trim($txt); 
  6. $txt = wordwrap($txt, 50, " ", 1);  //kroi d³ugie wyrazy
  7. $txt = preg_replace("/([w.]+@[w]+.[w.]+)/i","<a class=menu href=\"mailto:$1\" >$1</a>",$txt);
  8. $txt = preg_replace("/((http(s?)://)|(www.))([S]+.[S]+)/i","<a class=menu href=\"http$3://$4$5\" >&raquo; LINK</a>",$txt);
  9. $txt = substr($txt,0,3550); //max limit dlugosci tekstu
  10.  
  11. $txt = nl2br($txt); 
  12.  
  13. return $txt;
  14. }
  15. ?>
Kicok
W takim przypadku trzeba użyć wyrażeń regularnych do wstawiania spacji:
  1. <?php
  2.  
  3. $text = 'aaaaaaaaaaaaaaaaaaaaaaaaa(25) bbbbbbbbbbbbbbbbbbbb(20) ccccc(5) dddddddddddddddd(16) eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee(50) <br />
  4.  ht_tp://subdomena.domena.com.pl/direcotry1/direcotory2/some_file.php?var1=val1&var2=val2&amp;var3=val3 <br />
  5.  www.subdomena.domena.com.pl/direcotry1/direcotory2/some_file.php?var1=val1&var2=val2&amp;var3=val3';
  6.  
  7.  
  8. function wrap( $matches )
  9. {
  10. if( !empty( $matches[1] ) ) {
  11. // URL
  12. return $matches[1];
  13. }
  14.  
  15. return wordwrap( $matches[2], 20, " ", true );
  16. }
  17.  
  18. function createLink( $matches )
  19. {
  20. $url = empty( $matches[2] ) ? "http://" . $matches[1] : $matches[1];
  21. $url .= $matches[4];
  22. $url .= !empty( $matches[5] ) ? preg_replace( "#&(?!amp;?)#i", "&amp;", $matches[5] ) : "";
  23.  
  24. return "<a class=\"menu\" href=\"{$url}\">&raquo; LINK</a>";
  25. }
  26.  
  27. $text = preg_replace_callback( "#(((?:https?|ftp)://)|(www.))([^?]+)(?(?:S+))?#i","createLink", $text );
  28. $text = preg_replace_callback( "#(<a.*?>.*?</a>)|((?:^|s)S{21,})#", "wrap", $text );
  29.  
  30. echo $text;
  31.  
  32. ?>


Jeśli chcesz, żeby najdłuższe słowo mogło mieć 50 znaków, to zamień 20 w funkcji wordwrap oraz 21 w wyrażeniu regularnym na odpowiednio 50 i 51.



PS1. Zamień sobie "ht_tp" na "http", bo forum rozwalało mi kod.

PS2. Jeśli chcesz w ten sposób przetworzony tekst wyświetlić na ekranie, to nie używaj addslashes" title="Zobacz w manualu PHP" target="_manual. A jeśli powędruje on do bazy danych, to takie użycie addslashes" title="Zobacz w manualu PHP" target="_manual jakie można znaleźć w twoim kodzie stwarza zagrożenie atakiem SQL Injection.
nevt
1. Kicok co do użycia addslashes() - przecież linijkę wyżej jest strip_tags() - wiec dlaczego miałoby być niebezpieczne ? jeżeli dane lecą do bazy to jest jak najbardziej wskazane, byle nie zapomnieć o stripslashes() przy odczycie.
2. stal-sw co do strip_tags() -ja bym wywołał: strip_tags($txt, '<a>'); - i niepotrzebne byłoby potem mozolne odbudowywanie linków za pomocą przeg_replace()...
3. dzięki zaoszczędzeniu dwóch linijek z preg_replace() można teraz rozwiązać problem niepotrzebnych spacji nie pogarszając wydajności funkcji... zgodnie z propozycją Kicoka.
Kicok
Cytat
1. Kicok co do użycia addslashes() - przecież linijkę wyżej jest strip_tags() - wiec dlaczego miałoby być niebezpieczne ? jeżeli dane lecą do bazy to jest jak najbardziej wskazane, byle nie zapomnieć o stripslashes() przy odczycie.


Dlatego jest niebezpieczne, że jak napiszę `49 znaków i apostrof`, to addslashes zamieni mi to na `49 znaków, backslash, apostrof`. Później wordwrap wstawi spację po 50-tym znaku (czyli po backslash'u) i już mam niewyescape'owanego apostrofa ;]


addslashes umieszczone po wordwrap powinno być OK ;]
stal-sw
Witam.
No prawie dziala.

Kicok
- w towim kodzik jest taki problem.
Np. wpisuje w formularzu:
"
jakis tekscik xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxx

www.abcz.pl

www.xyz.net
"
A niestety po przejsciu prze twoje funkcyjki kod wyglada tak:
"
  1. <?php
  2. jakis tekscik xxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx xxx
    xxxxxxxxxxxxxxxxx xxxxxxx
  3. <br />
  4. <br /><class="menu" href="http://www.abc z.pl
  5. <br />
  6. <br />www.xyz.net">:: LINK</a>
  7. ?>

Te BRy to oczywisce Entery wcisniete podczas wypelniania formularza.

Masz moze pomysl jak zmodyfikowac ten kod aby dzialal poprawnie ?

Z gory dzieki za pomoc
Kicok
Zamieñ ([^?]+) na ([^\\s?]+), bo gdzie¶ mi to wcie³o ;]
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.