Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PCRE - wyłapanie treści ze strony
Forum PHP.pl > Forum > PHP
nilo
Cześć,

Od kilku godzin walczę z wyrażeniami regularnymi i niestety nie mogę sobie poradzić. Muszę z innej strony (za zgodą twórcy) wyłuskać kilka danych (w tym przypadku zdjęć z opisami), kod wygląda (po skróceniu) mniej więcej tak:

  1. <div class="photo"><a href="java script:show('Opis','images/foto1.jpg',100,200)" title="Opis"><img src="images/foto1_m.jpg" /></a>
  2. <p class="description">opis zdjecia</p></div>
  3.  
  4. <div class="photo"><a href="java script:show('Opis2 (ciekawy)','images/foto2.jpg',110,240)" title="Opis 2"><img src="images/foto2_m.jpg" /></a>
  5. <p class="description">opis zdjecia 2</p></div>


Liczba takich sekcji <div> jest zmienna, są one oddzielone dodatkowo kodem html, a całość znajduje się oczywiście między <body> a </body>.

Przyznam szczerze, że mam problemy nawet z wyborem funkcji, której użyć. Próbowałem preg_match_all, preg_replace oraz preg_split, ale bez efektu. Samo wyrażenie regularne robię w sposób podobny do tego:

  1. <?php
  2. $pattern='/<div class="photo"><a href="java script:show('.{1,20}','(.*)',d+,d+)" title=".{1,30}"><img src="(.{0,30})" /></a>.{1,50}<p class="description">(.{1,30)</p></div>/s';
  3. ?>


Próbuję to wstawiać do preg_match_all, ale nic sensownego mi nie wychodzi, mimo wielu naprawdę prób zmiany.

Mogę liczyć na pomoc?
hidee
Kod
$zdj=array();
$fragmenty=explode('<div class="photo">');
$c=count($fragmenty);
$m=array();

for($x=1;$x<$c;$x++)
{
  // dla wszystkich fragmentów z wyjątkiem zerowego wykonujesz:
  $znal=ereg(
  "<a [^>]*><img src="([^>]*)" /></a>[\r\n ]*<p class=\"description\">([^<]*)</p></div>",$fragmenty[$x],$m);
  );
  if($znal)
  $zdj[]=array('fotka'=>$m[1],'opis'=>$m[2]);
}


tablica $zdj jest dwuwymiarową tablicą zawierającą fotki z opisami.

PS.

Twój program nie działał ponieważ .* to dowolne znaki, a wyrażenia regularne zawsze dopasowują najdłuższy pasujący ciąg, tak więc w wynikach lądowały Ci również tagi HTML.

Przy rozbiórce HTML (chociaż sam wykonałem podobne zadanie z użyciem explode i działało o niebo szybciej) pamiętaj, aby w ereg stosować ograniczniki [^>] (wszystkie znaki bez znaku większości - wewnątrz tagu HTML) oraz [^<] (wszystkie znaki bez znaku mniejszości - pomiędzy tagami HTML).

Niniejsze rozwiązanie nie jest odporne na zmianę kolejności atrybutów wewnątrz tagu.

Rozwiązanie może zawierać drobne błędy widoczne na etapie parsowania/kompilacji - nie testowałem go z powodu braku czasu i motywacji (z uwagi, że nawet linka na tym nie zarabiam), ale powinno działać.
1010
I tutaj takie pytanie? Czy jak zastosujemy explode czy jest to lepsze rozwiązanie? Kodu na pewno będzie więcej... Efekt końcowy ten sam...
kosmowariat
explode ? w jaki sposób ? jakoś mało sensowne to rozwiązanie wg mnie
1010
tniesz na kawałki i wyciągasz odpowiednie fragmenty..
starach
A co chcesz wyciągnąć z tego kodu określ to precyzyjniej.
  1. <?php
  2. //<img src="images/foto1_m.jpg" />
  3. preg_match_all('#<img src="([^"]+)"#', $szukaj_w, $wyniki);
  4. print_r($wyniki);
  5. ?>
nilo
Cytat(hidee @ 20.07.2007, 07:42:49 ) *
Rozwiązanie może zawierać drobne błędy widoczne na etapie parsowania/kompilacji - nie testowałem go z powodu braku czasu i motywacji (z uwagi, że nawet linka na tym nie zarabiam), ale powinno działać.


Dzięki wielkie za kod i pomoc, zaraz zabieram się do analizy przeróbki.

Cytat(orglee @ 20.07.2007, 23:44:48 ) *
A co chcesz wyciągnąć z tego kodu określ to precyzyjniej.


Adres pliku .jpg (w sumie obojętnie którego, różnią się jedynie literką "m") oraz opis zdjęcia.



== Dopisane ==

Dzięki wszystkim za pomoc, udało mi się uzyskać pożądany efekt. Kluczem do sukcesu okazała się użycie tego [^"jakis znak"] - można z tym łatwo i szybko wyciągnąć potrzebne treści.
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.