Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] preg_match_all
Forum PHP.pl > Forum > PHP
Kazaan
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
sowiq
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
zimi
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
Kazaan
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
zimi
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
Kazaan
rozwiazanie:

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


dzieki zimi za nakierowanie !:)
zimi
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
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.