Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PCRE - wyłapanie treści ze strony
nilo
post
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 19.07.2007

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


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?
Go to the top of the page
+Quote Post
hidee
post
Post #2





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 7.11.2006

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


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ć.
Go to the top of the page
+Quote Post
1010
post
Post #3





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


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...
Go to the top of the page
+Quote Post
kosmowariat
post
Post #4





Grupa: Zarejestrowani
Postów: 235
Pomógł: 17
Dołączył: 18.07.2007
Skąd: Białystok

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


explode ? w jaki sposób ? jakoś mało sensowne to rozwiązanie wg mnie
Go to the top of the page
+Quote Post
1010
post
Post #5





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


tniesz na kawałki i wyciągasz odpowiednie fragmenty..
Go to the top of the page
+Quote Post
starach
post
Post #6





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


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. ?>
Go to the top of the page
+Quote Post
nilo
post
Post #7





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 19.07.2007

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


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.

Ten post edytował nilo 21.07.2007, 10:58:26
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 09:29