Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Różne od, negowanie wyrażenia regularnego
tosiek
post 13.04.2011, 20:58:23
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 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


Ten post edytował tosiek 13.04.2011, 21:07:00


--------------------
Go to the top of the page
+Quote Post
pmir13
post 13.04.2011, 21:00:37
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:
  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 ...
Go to the top of the page
+Quote Post
tosiek
post 13.04.2011, 21:03:11
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


--------------------
Go to the top of the page
+Quote Post
Bags_Bunny
post 13.04.2011, 21:09:45
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ą wink.gif.

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

To jest wzór na pasujące rozszerzenia. Przerób tak, jak lubisz wink.gif


--------------------
rm -rf /*
Go to the top of the page
+Quote Post
tosiek
post 13.04.2011, 21:14:11
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


--------------------
Go to the top of the page
+Quote Post
Bags_Bunny
post 13.04.2011, 21:52:17
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 /*
Go to the top of the page
+Quote Post
pmir13
post 13.04.2011, 22:00:59
Post #7





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


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))$
Go to the top of the page
+Quote Post
Zyx
post 14.04.2011, 18:18:52
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
Go to the top of the page
+Quote Post
tosiek
post 14.04.2011, 20:14:50
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 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.


--------------------
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: 15.08.2025 - 03:32