Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: upload plików - bezpieczna nazwa
Forum PHP.pl > Forum > PHP
Birkoff
Witam wszystkich zainteresowanych!

Uploaduje plik - raczej w standardowy sposób, bez udziwnień - kopiuje plik przez formularz, potem sprawdzenie czy jest skopiowany, potem wygenerowanie bezpiecznej nazwy i zapisanie go pod ta nazwa w katalogu docelowym.

Sprawa dotyczy wła¶nie tej bezpiecznej nazwy. Przepuszczam nazwe pliku przez tak± funkcję:

  1. <?php
  2.  
  3. function safe_name($name) {
  4.     $name=trim($name);
  5.     $name=str_replace(&#092;" \", \"_\", $name);
  6.     $name=str_replace(&#092;"¶\", \"s\", $name);
  7.     $name=str_replace(&#092;"ć\", \"c\", $name);
  8.     $name=str_replace(&#092;"±\", \"a\", $name);
  9.     $name=str_replace(&#092;"ó\", \"o\", $name);
  10.     $name=str_replace(&#092;"ż\", \"z\", $name);
  11.     $name=str_replace(&#092;"Ą\", \"z\", $name);
  12.     $name=str_replace(&#092;"ń\", \"n\", $name);
  13.     $name=str_replace(&#092;"ł\", \"l\", $name);
  14.     $name=str_replace(&#092;"ę\", \"e\", $name);
  15.     $name=str_replace(&#092;"'\", \"_\", $name);
  16.     return $name;
  17.     }
  18.  
  19. ?>


Jak widać funkcja ta zamienia polskie naki zakodowane w iso-8859-2 na uniwersalne znaki z podstawowego zestawu liter z alfabetu...

Pytanie: jak przerobić t± funkcję na bardziej uniwersaln±?

Jest ona dobra dla polskich znakow, ale co z innymi? RObię dajmy na to stronę dla Francuzów, a oni maj± te swoje porypane akcenty, do tego kodowanie iso-8859-1.

Jak sprytnie przekonwertować tak± nazwę na zakres podstawowych liter alfabetu A-Z i a-z oraz 1-9 bez żadnych dodatkowych literek, zamieniajac wszystkie spoza tego zakresu na znak podkreslenia: _ questionmark.gif

Podejrzewam, że możnaby użyć wyrażeń regularnych ale nie mam pojęcia jak...
Je¶li kto¶ ma jaki¶ pomysł/gotowy skrypt/dobr± radę to bardzo proszę o pomoc smile.gif

Przenoszę: Skrypty php -> php / crashu
aleksander
  1. <?php
  2. ereg_replace( '[ęó±¶łżĽćń]', '_' );
  3. ?>
crash
Co¶ wg. mnie uniwersalniejszego:
  1. <?php
  2. $wyr = 'Chrz±¶żćĽŁE';
  3.  
  4. $now = '';
  5.  
  6. for( $i = 0; $i < strlen( $wyr ); $i++ )
  7. {
  8.    if( ord( $wyr[ $i ] ) < 48 or ord( $wyr[ $i ] ) > 122 )
  9.    {
  10.       $now .= '_';
  11.    } 
  12.    else
  13.    {
  14.       $now .= $wyr[ $i ];
  15.    }
  16. }
  17. echo $now;
  18. ?>

Dobra, ¶wietny jestem, to samo zrobi:
  1. <?php
  2. echo preg_replace( '/[^a-zA-Z0-9]{1}/', '_', $wyr );
  3. ?>
Birkoff
Ok, zainspirowany odpowiedziami (za które dziękuję smile.gif ) zmodyfikowałem trochę moj skrypt - choć nie zmniejszył swojej objęto¶ci smile.gif

Rozwi±zanie które proponujecie działa pięknie, ale zamienia wszystkie "dziwne" litery na znak podkreslenia. A chodzi o to zeby na przyklad "±" zamienić na "a" itp.

Tak więc wrzucam poprawion± funkcję:

  1. <?php
  2.  
  3. function safe_name($name) {
  4. $name=trim($name);
  5. $name=str_replace(&#092;"¶\", \"s\", $name);
  6. $name=str_replace(&#092;"ć\", \"c\", $name);
  7. $name=str_replace(&#092;"±\", \"a\", $name);
  8. $name=str_replace(&#092;"ó\", \"o\", $name);
  9. $name=str_replace(&#092;"ż\", \"z\", $name);
  10. $name=str_replace(&#092;"Ą\", \"z\", $name);
  11. $name=str_replace(&#092;"ń\", \"n\", $name);
  12. $name=str_replace(&#092;"ł\", \"l\", $name);
  13. $name=str_replace(&#092;"ę\", \"e\", $name);
  14. $filename=explode('.',$name);
  15. $file_name=$filename[0];
  16. $file_ext=$filename[1];
  17. $file_name=preg_replace( '/[^a-zA-Z0-9]{1}/', '_', $file_name);
  18. $name=$file_name.'.'.$file_ext;
  19. return $name;
  20. }
  21.  
  22. $filename=&#092;"Historia żółtej ciżemki Johanson's.zip\";
  23. echo $filename;
  24. $filename=safe_name($filename);
  25. echo '<br>'.$filename;
  26.  
  27. ?>


Dla powyższego kodu wynikiem będzie:

  1. Historia żółtej ciżemki Johanson's.zip
  2. Historia_zoltej_cizemki_Johanson_s.zip


Jak widać polskie literki s± zamieniane na podstawowe znaki z alfabetu, a wszystkie inne spoza zakrezu a-zA-Z1-9 s± zamieniane na znak podkreslenia.

Zaszla potrzeba rozdzielenia nazwy pliku od rozszerzenia - zrobilem explode() po kropce, pojawia się tylko pytanie: co je¶li w nazwie występuje więcej niż jedna kropka?

Dla nazwa.doc.zip nazwa wynikow± bedzie nazwa.doc, co jest już błędem...

Jakie¶ pomysły co z tym fantem zrobić?
tiraeth
Cytat
Zaszla potrzeba rozdzielenia nazwy pliku od rozszerzenia - zrobilem explode() po kropce, pojawia się tylko pytanie: co je¶li w nazwie występuje więcej niż jedna kropka?

  1. <?php
  2. $nazwa = 'nazwa.doc.zip';
  3. $czlony = explode('.', $nazwa);
  4. $liczba = count($czlony); $liczba--;
  5.  
  6. $rozszezenie = $czlony[$liczba];
  7. ?>
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.