Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> upload plików - bezpieczna nazwa, jak przetworzyć nazwę pliku...
Birkoff
post 13.07.2005, 22:05:42
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: _ 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


--------------------
Webcoder
Go to the top of the page
+Quote Post
aleksander
post 13.07.2005, 22:13:43
Post #2





Grupa: Przyjaciele php.pl
Postów: 742
Pomógł: 0
Dołączył: 14.12.2003
Skąd: Gdańsk, Trójmiasto

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


  1. <?php
  2. ereg_replace( '[ęóąśłżźćń]', '_' );
  3. ?>
Go to the top of the page
+Quote Post
crash
post 14.07.2005, 09:54:00
Post #3





Grupa: Przyjaciele php.pl
Postów: 2 196
Pomógł: 2
Dołączył: 17.01.2004
Skąd: Sosnowiec

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


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. ?>


--------------------
Go to the top of the page
+Quote Post
Birkoff
post 14.07.2005, 11:11:47
Post #4





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ę 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ć?

Ten post edytował Birkoff 14.07.2005, 11:13:55


--------------------
Webcoder
Go to the top of the page
+Quote Post
tiraeth
post 14.07.2005, 16:31:29
Post #5





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

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


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. ?>
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 04:04