Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> upload plików - bezpieczna nazwa, jak przetworzyć nazwę pliku...
Birkoff
post
Post #1





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 23.10.2003
Skąd: Gdańsk

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


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: _ (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Przenoszę: Skrypty php -> php / crashu
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Birkoff
post
Post #2





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 23.10.2003
Skąd: Gdańsk

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


Ok, zainspirowany odpowiedziami (za które dziękuję (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ) zmodyfikowałem trochę moj skrypt - choć nie zmniejszył swojej objętości (IMG:http://forum.php.pl/style_emoticons/default/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ć?

Ten post edytował Birkoff 14.07.2005, 11:13:55
Go to the top of the page
+Quote Post

Posty w temacie


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: 5.10.2025 - 17:01