Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> REGEXP - Sprawdzenie, czy plik posiada jedno z podanych rozszerzeń, i zanegowanie wyniku
adbacz
post 22.10.2014, 08:46:31
Post #1





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

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


Jak napisać wyrażenie, które zwróci mi fałsz, jeśli nazwa pliku posiada jedno z podanych rozszerzeń? Napisałem coś takiego i wiem, że nie ma prawa działać, ale pokazuję, żeby nikt nie pisał, że nie próbowałem:

Kod
/\.(php|phps|php5|php4|bin|js|p|pas|java|jav|class|inc|php|py|pl|cgi|gz|tgz|bz|b
z2|tbz|zip|rar|tar|7z|gtar|gzip)$/i
/\.[^php|phps|php5|php4|bin|js|p|pas|java|jav|class|inc|php|py|pl|cgi|gz|tgz|bz|
bz2|tbz|zip|rar|tar|7z|gtar|gzip]$/i


W pierwszym przykładzie nie wiem jak zanegować całe wyrażenie, a w drugim jest zanegowane, ale nie wiem jak zrobić, by w nawiasach klamrowych była opcja "lub".
Go to the top of the page
+Quote Post
viking
post 22.10.2014, 08:53:14
Post #2





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


A nie łatwiej stworzyć tablicę rozszerzeń i sprawdzać czy http://php.net/manual/en/splfileinfo.getextension.php w niej występuje bądź nie?


--------------------
Go to the top of the page
+Quote Post
nospor
post 22.10.2014, 08:53:15
Post #3





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Nie prosciej i czytelniej pobrac ci to rozszerzenie z nazwy pliku i porownac do tablicy rozszerzen uzywajac in_array ?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
adbacz
post 22.10.2014, 09:05:30
Post #4





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

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


Używam dodatku o nazwie elFinder i tam niestety może być tylko wyrażenie regularne. Więc muszę mieć wyrażenie regularne, które neguje mi te rozszerzenia.
Go to the top of the page
+Quote Post
kreatiff
post 22.10.2014, 11:05:43
Post #5





Grupa: Zarejestrowani
Postów: 324
Pomógł: 105
Dołączył: 7.08.2012

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


@nospor poniżej:
A rzeczywiście, pewnie masz rację. No to trzeba będzie inaczej pokombinować, gdyż poniższe to kod, a nie samo wyrażenie.

Jeśli koniecznie wyrażenia reg. to np. tak (wykorzystując Twoje pierwsze wyrażenie):
  1. $nazwa = 'plik.7z';
  2. $nazwa2 = 'plik2.txt';
  3.  
  4. function rozszerzenie($nazwa) {
  5. return preg_match('#\.(php|phps|php5|php4|bin|js|p|pas|java|jav|class|inc|php|py|pl|cgi|gz|tgz|bz|
    bz2|tbz|zip|rar|tar|7z|gtar|gzip)$#iu'
    , $nazwa) === 0 ? true : false; // preg_match zwraca 0 (brak trafień), 1 (jest dopasowanie) lub false (błąd)
  6. }
  7.  
  8. var_dump( rozszerzenie($nazwa) ); // false - rozszerzenie jest na liście
  9. var_dump( rozszerzenie($nazwa2) ); // true - brak rozszerzenia

Aha, dodam, że nie trzeba wcale tworzyć funkcji i jeszcze brakuje obsłużenia sytuacji, gdy rzeczywiśćie trafimy na błąd. Czyli można to zrobić lepiej. Samo zanegowanie wyrażenia regularnego można jak widać zrobić na kilka sposobów.

Ten post edytował kreatiff 22.10.2014, 11:12:48
Go to the top of the page
+Quote Post
nospor
post 22.10.2014, 11:08:38
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@kreatif ale chodzi chyba o to, ze adbacz ma mozliwosc jedynie wstawienia wyrazenia regularnego. Jakby mogl wstawic kod php, jak proponujesz, to rownie dobrze moglby zrobić jak mu pisalismy na początku


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
kreatiff
post 22.10.2014, 11:18:31
Post #7





Grupa: Zarejestrowani
Postów: 324
Pomógł: 105
Dołączył: 7.08.2012

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


Racja, ale teraz zatem dochodzimy do etapu, gdzie bez wiedzy jak wyrażenie jest przyrównywane do nazw plików, nie jesteśmy w stanie podać rozwiązania. Bo samo preg_match (jesli jest wykorzystywane) zwraca false tylko jeśli natrafi na błąd i samo z siebie nie zwróci fałszu, gdy trafienie będzie lub nie.
Go to the top of the page
+Quote Post
aniolekx
post 22.10.2014, 11:36:27
Post #8





Grupa: Zarejestrowani
Postów: 340
Pomógł: 46
Dołączył: 31.07.2009
Skąd: A

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


  1. /\.(?!(php|phps|php5|php4|bin|js|p|pas|java|jav|class|inc|php|py|pl|cgi|gz|tgz|bz|bz2|tbz|zip|rar|tar|7z|gtar|gzip)$)/i



tutaj sprawdziłem.

Ten post edytował aniolekx 22.10.2014, 11:40:16
Go to the top of the page
+Quote Post
kreatiff
post 22.10.2014, 12:35:38
Post #9





Grupa: Zarejestrowani
Postów: 324
Pomógł: 105
Dołączył: 7.08.2012

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


Chodzi o to, jak wyrażenie zostanie użyte w aplikacji, gdzie będzie wykorzystywane. To jest jakiś CMS, gdzie w panelu wpisujesz ten ciąg, i tylko jego? A gotowy mechanizm sobie wykorzystuje tenże ciąg wg własnego algorytmu?

Bo jeśli będzie podstawione do preg_match, to tak jak wyżej - nie zwróci false inaczej niż gdy natrafi na błąd (takim błędem może być np. jakiś znak spoza UTF-8, gdy nasz ciag porównujemy z modyfikatorem u).

Na stronie, którą podałeś jest wykorzystywane własnie preg_match. Zatem to nigdy nie zwróci false gdy nie wystąpi błąd (a ten nie może wystąpić, by dopasowanie lub niedopasowanie było wykonane poprawnie).

Chyba, że 0 (ale === 0, nie == 0 - musi zostać przyrównany również typ) potraktujesz jako false.

  1. '#.*(?<!\.7z|\.php)$#iu' // tutaj musisz dodać wszystkie końcówki w taki sam sposób


Ten post edytował kreatiff 22.10.2014, 12:37:17
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: 13.08.2025 - 22:44