Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: REGEXP - Sprawdzenie, czy plik posiada jedno z podanych rozszerzeń, i zanegowanie wyniku
Forum PHP.pl > Forum > PHP
adbacz
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".
viking
A nie łatwiej stworzyć tablicę rozszerzeń i sprawdzać czy http://php.net/manual/en/splfileinfo.getextension.php w niej występuje bądź nie?
nospor
Nie prosciej i czytelniej pobrac ci to rozszerzenie z nazwy pliku i porownac do tablicy rozszerzen uzywajac in_array ?
adbacz
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.
kreatiff
@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.
nospor
@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
kreatiff
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.
aniolekx
  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.
kreatiff
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
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.