![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 0 Dołączył: 7.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() 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
Ten post edytował tosiek 13.04.2011, 21:07:00 -------------------- |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 282 Pomógł: 89 Dołączył: 12.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
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: 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:
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 ... |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 0 Dołączył: 7.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
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? Ten post edytował tosiek 13.04.2011, 21:05:14 -------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 262 Pomógł: 39 Dołączył: 12.04.2004 Ostrzeżenie: (0%) ![]() ![]() |
A może jednak look ahead?
Kod \.(?!png|jpg|jpeg|gif|bmp|js|css)([[:alnum:]]{3,4})$ Nie ma problemów z kropką ![]() Kod [[:alnum:]]{3,4} To jest wzór na pasujące rozszerzenia. Przerób tak, jak lubisz ![]() -------------------- rm -rf /*
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 0 Dołączył: 7.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Bags_Bunny nie zwraca fałszu tj. int(0) gdy znajdzie pożądane rozszerzenie, odpada.
Ten post edytował tosiek 13.04.2011, 21:14:56 -------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 262 Pomógł: 39 Dołączył: 12.04.2004 Ostrzeżenie: (0%) ![]() ![]() |
To widocznie coś sknociłeś, bo u mnie działa. Pokaż cały kod.
-------------------- rm -rf /*
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 282 Pomógł: 89 Dołączył: 12.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
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))$
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) ![]() ![]() |
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.
-------------------- Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 0 Dołączył: 7.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 15.08.2025 - 03:32 |