Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Różne od, negowanie wyrażenia regularnego
Forum PHP.pl > Forum > PHP
tosiek
Główkuję od dłuższego czasu jak negować wyrażenie regularne (nie chodzi mi o negowanie funkcji wykonującej to wyrażenie). Ma sprawdzać czy rozszerzenie pliku jest różne od.

Doszedłem do takiego etapu:
Kod
\.(?<!png|jpg|jpeg|gif|bmp|js|css)$

No ale nie działa, mi się kończą pomysły smile.gif Byłbym wdzięczny za pomoc.

Uff rozwiązałem, bardzo, bardzo rzadkie jest to zagadnienie i najczęściej kończy się: lookbehind assertion is not fixed length at offset

Rozwiązanie :
Kod
(?<!\.png|\.jpg|\.jpeg|\.gif|\.bmp|\.js|\.css)$



Jak ktoś ma pomysł jak oddzielić kropkę to byłbym wdzięczny bo próby tego typu:
Kod
(?<!\.(png|jpg|jpeg|gif|bmp|js|css))$

kończą się:
Cytat
preg_match_all() [<a href='function.preg-match-all'>function.preg-match-all</a>]: Compilation failed: lookbehind assertion is not fixed length at offset 37
pmir13
Prawie dobrze, ale przy look behind musisz też ustawić wzorzec, który będzie pasował do reszty rozszerzeń.
Zakładając że kropki do rozszerzenia nie liczysz w wersji lekkiej:
  1. preg_match("/^[^\.]*(?<!png|jpg|jpeg|gif|bmp|js|css)$/", $rozszerzenie);

Pasuje, jeśli:
1. Składa się z dowolnej liczby znaków ale nie kropki
2. (look behind) ale nie pasuje jeśli kończy się na png lub jpg lub ...

W tym przypadku przejdą rozszerzenia, które nie są możliwe, np:
do/c
\abc
x|y

W wersji twardszej:
  1. preg_match("/^([a-zA-Z0-9\$\%\'\-\_\@\~\`\!\(\)\^\#\&\+\,\;\=\[\]])*(?<!png|jpg|jpeg|gif|bmp|js|css)$/", $rozszerzenie);

Czyli pasuje, jeśli:
1. Składa się z dowolnej liczby znaków z zestawu: a-z A-Z 0-9 $%'-_@~`!()^#&+,;=[]
2. Ale nie pasuje jeśli kończy się na png lub jpg lub ...
tosiek
W tym wyżej nie działa case insetitive (nie mogę użyć modyfikatora), rozwiązanie (działa super, ale trzeba dopisywać kropkę):

Kod
(?i:(?<!\.png|\.jpg|\.jpeg|\.gif|\.bmp|\.js|\.css))$


Ktoś ma pomysł na kropkę i połączanie insetitive z Negative Lookbehind?
Bags_Bunny
A może jednak look ahead?
Kod
\.(?!png|jpg|jpeg|gif|bmp|js|css)([[:alnum:]]{3,4})$

Nie ma problemów z kropką wink.gif.

Kod
[[:alnum:]]{3,4}

To jest wzór na pasujące rozszerzenia. Przerób tak, jak lubisz wink.gif
tosiek
Bags_Bunny nie zwraca fałszu tj. int(0) gdy znajdzie pożądane rozszerzenie, odpada.
Bags_Bunny
To widocznie coś sknociłeś, bo u mnie działa. Pokaż cały kod.
pmir13
Cytat(tosiek @ 13.04.2011, 22:03:11 ) *
W tym wyżej nie działa case insetitive (nie mogę użyć modyfikatora), rozwiązanie (działa super, ale trzeba dopisywać kropkę):
Ktoś ma pomysł na kropkę i połączanie insetitive z Negative Lookbehind?

Może tak?
Kod
^[\.][^\.]*(?i:(?<!\.png|\.jpg|\.jpeg|\.gif|\.bmp|\.js|\.css))$
Zyx
Każdy automat skończony da się zanegować, zamieniając znaczeniami stan akceptujący i odrzucający. Nie potrzeba do tego żadnych rozszerzeń modelu oferowanych przez PCRE. W przypadku implementacji PHP wyrażenie regularne neguje się zatem najzwyczajniej w świecie negując funkcję je wykonującą. Tak mówi matematyka, a jak nie chcesz podanego na tacy rozwiązania, to się męcz.
tosiek
Cytat
Główkuję od dłuższego czasu jak negować wyrażenie regularne (nie chodzi mi o negowanie funkcji wykonującej to wyrażenie). Ma sprawdzać czy rozszerzenie pliku jest różne od

Przykładowe zastosowanie:
Kod
<FilesMatch "(?i:(?<!\.png|\.jpg|\.jpeg|\.gif|\.bmp|\.js|\.css))$">
Order Allow,Deny
Deny from All
</FilesMatch>

Blokuje wszystkie pliki poza dozwolonymi rozszerzeniami, a dozwolone mogą dziedziczyć blokowanie i nie trzeba im ustawiać Allow from All.

Niestety ale tutaj nie można zanegować funkcji wink.gif Rozwiązanie już mam, pisałem o tym wyżej, ale chciałem dopracować tę kropkę, żeby nie trzeba było do każdego rozszerzenia dodawać, ale to chyba jest niewykonalne.
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.