Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] preg_match_all
Kazaan
post 17.07.2008, 13:58:45
Post #1





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 17.07.2008

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


Witam wszystkich forumowiczow smile.gif

Mam problem z preg_match_all - mianowicie chcialem napisac uniwersalny skrypt pobierajacy url do grafiki z galerii ktore kieruja tylko do duzych obrazkow, w skrocie fotki z galerii z pominieciem reklam itp

mam taki kod:
Kod
$zmienna = file_get_contents("http://www.adresstron.com/galeria/");
preg_match_all("((<((a|A).(href|HREF|Href).[=(\"|')])([a-zA-Z0-9/\._-]*.jpg|JPG|png|PNG|jpeg|JPEG|gif|GIF)((\"|')><(img src|IMG SRC|img border=1 src)=(\"|'))([a-zA-Z0-9/\._-]*.(jpg|JPG|png|PNG|jpeg|JPEG|gif|GIF))(\"|')))",$zmienna, $matches);

print_r($matches);


Niestety raz wyswietla poprawnie wartosci raz nie, gdzie tkwi problem?? jesli ktos zna rozwiazanie to z gory dziekuje za pomoc!

Pozdrawiam
Kazaan
Go to the top of the page
+Quote Post
sowiq
post 17.07.2008, 14:18:06
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


O kurde... Po pierwsze to polecam zapoznać się z przełącznikiem /i, który powoduje dopasowanie dużych i małych znaków. Więcej tu: http://uk.php.net/manual/pl/reference.pcre...n.modifiers.php
Go to the top of the page
+Quote Post
zimi
post 17.07.2008, 14:24:40
Post #3





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

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


tak modyfikator i jako pierwszy zdecydowanie
jako drugie nie widzę tutaj ograniczników wyrażenia regualrnego, tak żeby ten modyfikator i można było gdzieś wstawić, po trzecie ([a-zA-Z0-9/\._-]*.jpg|JPG|png|PNG|jpeg|JPEG|gif|GIF) ten fragment dopasuję, jakiś ciąg znaków z końcówką jpg i to wcale przed jpg nie musi być kropki bo w regularce nie jest zacytowana, lub dopasuję inne z rozszerzeń bez nazwy pliku (prawdopodobnie)
po czwarte nie zakładasz że przed adresem może się znaleźć np. title
po piąte pewnie jeszcze kilku rzeczy nie zakładasz, proponuję się przebić przez tutorial do wyrażeń regularnych jeszcze raz... i napisanie sensowniejszego regexp'a... potem można patrzeć dalej
Go to the top of the page
+Quote Post
Kazaan
post 17.07.2008, 15:57:59
Post #4





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 17.07.2008

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


Czyli powinno to wygladac mniej wiecej tak:
Kod
"/<a\s(.*)?href=(\"|')[a-z0-9/\._-]*\.(jpg|png|gif|jpeg)(\"|')><img\s(.*)?src=(\"|')[a-z0-9/\._-]*\.(jpg|png|gif|jpeg)(\"|')(\s/)?>/i"


kurcze gdzies sie wdal blad do ktorego nie moge dojsc, moze ktos z Was go widzi?? wyklada mi pusty array

Ten post edytował Kazaan 17.07.2008, 16:00:09
Go to the top of the page
+Quote Post
zimi
post 17.07.2008, 16:10:06
Post #5





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

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


znacznie lepiej, ale ujawnił się nowy problem jeśli mnie pamięć nie myli:
jeżeli jakiś znak wziąłeś jako ogranicznik wyrażenia regularnego to w samym wyrażeniu regularnym musisz go cytować
zatem w Twoim wypadku w regularce zamiast pisać / musisz pisać \/ albo \\/ (bo przed php chyba musimy cytować nasz znak cytowania smile.gif )

1. poza tym: \s wydaje mi się zbędne jako że zaraz masz (.*)? więc te białe znaki i tak zostaną dopasowane
2. być może (nie wiem z jakiego kodu chcesz to wyciagać więc trochę strzelam) przyda się modyfikator 's' który do .* może dopasować też znak nowej lini etc. wiecej w manualu
3. nie jest najlepszym pomysłem stosowanie ".*" jako że wyrażenia regularne są zachłanne proponuję zastosować np. [^>]+ zamiast \s(.*)?
4. wyrażenie regularne nie bierzę pod uwagę że coś może znajdować się po href lub src

narazie to tyle

Ten post edytował zimi 17.07.2008, 16:11:07
Go to the top of the page
+Quote Post
Kazaan
post 17.07.2008, 16:54:54
Post #6





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 17.07.2008

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


rozwiazanie:

Kod
preg_match_all( '/(<a\s+(\w+)\s*=\s*["\']([^"]+).jpg|jpeg["\'])(.*)>(<img[^>]*src="([^"]*).jpg|jpeg")/i', $liniastrony, $matches);


dzieki zimi za nakierowanie !:)
Go to the top of the page
+Quote Post
zimi
post 17.07.2008, 17:31:39
Post #7





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

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


jeśli regularka zaczęła Ci działać, to niby dobrze, ale popełniasz większość z błędów o których wspomaniałem, zalecam jeszcze raz przyjrzeć się tej regularce pod kątem tego co napisałem i zastanowić się nad tym wyrażeniem żeby się nie okazało że to rozwiązanie na krótki czas...

jest ono złe i ma wiele dziur, przetestuj sobie coś takiego ze swoim kodem:
Kod
$liniastrony = 'cos<a href=\'jakis\' title=\'Przedstawiony plik w formacie jpg><img src="jpeg">jpeg"ble';


pamiętaj że nie zawsze możesz liczyć na to że kody będą zgodne ze standardami, wystarczy że będą wyświetlane tak jak ktoś tego chce, nie musi być apostrofów, może jakiegoś braknie
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: 20.07.2025 - 11:21