Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]preg_match_all() jak wyciągnąć kilka danych na raz
Forum PHP.pl > Forum > Przedszkole
PYJTER
Witam mam taki problem mianowicie chciałbym wyciągnąć dane KOD, Miasto, Ulica np. dla strony: http://www.pkt.pl/kwiaty/4-1/ i jak zrobię tak to ładnie mi wszystkie kody pocztowe zbierze:

  1.  
  2. <?php
  3. $content = file_get_contents('http://www.pkt.pl/kwiaty/4-1/');
  4. preg_match_all('#<span class="zipCode" itemprop="postalCode">(.*?)<\/span>#si', $content, $wynik);
  5. print_r($wynik);
  6. ?>
  7.  


I wynik jest w tablicy super ładnie i teraz pytanie jak zrobić by dodać do wyrażenia i miasto i ulicę oraz nazwę dodatkowo/ jak dokleić do tego co wyżej jeszcze takie wyrażenie: <span class="city" itemprop="addressRegion">(.*?)<\/span> bo próbuję i zwraca mi tylko Array ( )

Przykład kodu źródłowego z którego chcę wyciągnąć dane:
  1. <h2 class="paidS">
  2.  
  3.  
  4. <a href="http://www.pkt.pl/frezja-s-c-kwiaciarnia-dekoracje-%C5%9Blubne-sal/100729543/5-1/?type=local"
  5. title="KWIACIARNIA XXX"
  6. class="trkname_resultsclick trkkey_100729543-local"
  7. itemprop="name"
  8. >
  9. KWIACIARNIA XXX
  10. </a>
  11. </h2>
  12. </li>
  13.  
  14.  
  15.  
  16. <li><p class="address" itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
  17. <span class="zipCode" itemprop="postalCode">00-000</span>
  18. <span class="city" itemprop="addressRegion">Burzykowo</span>
  19. <span class="addressComma">,</span>
  20. <span class="street" itemprop="streetAddress">
  21. pl. Adamsów 666
  22. </span>


Z góry dziękuję za pomoc
Daimos
  1. <?php
  2.  
  3. $html = '
  4. <li><p class="address" itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
  5. <span class="zipCode" itemprop="postalCode">00-000</span>
  6. <span class="city" itemprop="addressRegion">Burzykowo</span>
  7. <span class="addressComma">,</span>
  8. <span class="street" itemprop="streetAddress">
  9. pl. Adamsów 666
  10. </span>';
  11. $pattern = '#<span class="zipCode" itemprop="postalCode">(.+?)</span>.+?'
  12. . '<span class="city" itemprop="addressRegion">(.+?)</span>.+?'
  13. . '<span class="street" itemprop="streetAddress">(.+?)</span>'
  14. . '#s';
  15. preg_match_all($pattern, $html, $matches);
  16. var_dump($matches);

Ale zdecydowanie lepiej będzie Ci biegać po kodzie html za pomocą dom
PYJTER
Dzięki działa super ale dalej nie potrafię wyciągnąć danych np nazwy albo link'a załóżmy przykładowo poniżej jakaś firms

  1. <h2 >
  2.  
  3.  
  4. <a href="http://www.pkt.pl/frezja-s-c-kwiaciarnia-dekoracje-%C5%9Blubne-sal/100729543/5-1/?type=local"
  5. title="Frezja s.c. Kwiaciarnia. Dekoracje ślubne sal"
  6. class="trkname_resultsclick trkkey_100729543-local"
  7. itemprop="name"
  8. >
  9. Frezja s.c. Kwiaciarnia. Dekoracje ślubne sal
  10.  
  11. </a>
  12. </h2>



I chcę wyciągnąć dane między znacznikami <h2 > a </h2> załóżmy chce link wyciągnąć ten: http://www.pkt.pl/frezja-s-c-kwiaciarnia-d...5-1/?type=local

bo próbuję np:
  1. '#<h2><a href="(.+?)" title="#si'
i nic nie zwraca thumbsdownsmileyanim.gif

i sprawa jeszcze jedna telefon:

  1. <div class="phone" itemprop="telephone">Tel: <b>00 222 33 44</b></div>


kod taki:

  1. '#<div class="phone" itemprop="telephone">Tel: <b>(.+?)</b></div>#si'


także zwraca pustą tablicę...
_Borys_
Kod
'#<h2.*>\s*<a href="(.+?)".+>\s*(.+)\s*<\/a>#si'

Tam gdzie jest dużo spacji stosuj \s*
A przy telefonie musisz dodać backslash-e przed slashami <\/b><\/div>
abjk
  1. preg_match_all('#<h2\s(?:class="paidS")?>[^<]*<a[^>]+>\s*(?<name>[\p{L}\p{Nd}\p{P}\p{Zs}]+)(?:[^<]*</?[a-z0-9]{1,2}>){4}(?:<[a-z0-9]\s(?:[a-z]+\s?(?:="[^"]+"\s*)*){4}>)
  2. (?:(?:[^<]*<[a-z]{4}[^>]*>)(?<zipCode>[^<]+)(?:\s?</[a-z]{4}>))
  3. (?:(?:[^<]*<[a-z]{4}[^>]*>)(?<city>[^<]+)(?:\s?</[a-z]{4}>))
  4. (?:(?:(?:[^<]*<[a-z]{4}[^>]*>)(?<addressComma>[^<]+)(?:\s?</[a-z]{4}>))
  5. (?:(?:[^<]*<[a-z]{4}[^>]*>)(?<street>[\p{L}\p{Nd}\p{P}\p{Zs}\n]+(?![^<]))(?:\s?</[a-z]{4}>)))?#usi', $content, $wynik);
  6.  
  7. var_dump($wynik['name'],$wynik['zipCode'],$wynik['city'],$wynik['addressComma'],$wynik['street']);
PYJTER
Cytat(abjk @ 11.02.2014, 13:37:22 ) *
  1. preg_match_all('#<h2\s(?:class="paidS")?>[^<]*<a[^>]+>\s*(?<name>[\p{L}\p{Nd}\p{P}\p{Zs}]+)(?:[^<]*</?[a-z0-9]{1,2}>){4}(?:<[a-z0-9]\s(?:[a-z]+\s?(?:="[^"]+"\s*)*){4}>)
  2. (?:(?:[^<]*<[a-z]{4}[^>]*>)(?<zipCode>[^<]+)(?:\s?</[a-z]{4}>))
  3. (?:(?:[^<]*<[a-z]{4}[^>]*>)(?<city>[^<]+)(?:\s?</[a-z]{4}>))
  4. (?:(?:(?:[^<]*<[a-z]{4}[^>]*>)(?<addressComma>[^<]+)(?:\s?</[a-z]{4}>))
  5. (?:(?:[^<]*<[a-z]{4}[^>]*>)(?<street>[\p{L}\p{Nd}\p{P}\p{Zs}\n]+(?![^<]))(?:\s?</[a-z]{4}>)))?#usi', $content, $wynik);
  6.  
  7. var_dump($wynik['name'],$wynik['zipCode'],$wynik['city'],$wynik['addressComma'],$wynik['street']);


Chyba będę musiał to rozpisać na kartce żeby zrozumieć biggrin.gif ale dzięki serdeczne wink.gif chodziło mi dokłądnie o <h2\s(?:class="paidS")?> wink.gif ale z miłą chęcią ogarnę resztę wink.gif
znowu coś nowego... wink.gif
A jeszcze mam pytanie z innej beczki czasami można spotkać adres email a czasami nie i teraz... mam wyrażenie regularne 'nazwa'.'adres'.'mail' i jak jes mail podany to jest oki a jak nie to wywala mi błąd Notice: Undefined offset: 0 no wiadomo bo nie znalazł nic zgodnego ale jak zrobić by jeśli nie ma podanego mail zwróciło tylko np. 'nazwa'.'adres'.' ' czyli jeśli nie ma wzorca w kodzie html zwraca mi nazwę adres oraz pustą wartość.
Turson
Cytat
A jeszcze mam pytanie z innej beczki czasami można spotkać adres email a czasami nie i teraz... mam wyrażenie regularne 'nazwa'.'adres'.'mail' i jak jes mail podany to jest oki a jak nie to wywala mi błąd Notice: Undefined offset: 0 no wiadomo bo nie znalazł nic zgodnego ale jak zrobić by jeśli nie ma podanego mail zwróciło tylko np. 'nazwa'.'adres'.' ' czyli jeśli nie ma wzorca w kodzie html zwraca mi nazwę adres oraz pustą wartość.

możesz podać przykład?
PYJTER
Oki podam przykład złóżmy:
Link 1:
http://www.pkt.pl/melbet-sp-z-o-o-producen...5-1/?type=local

i Link 2:
http://www.pkt.pl/cegie%C5%82ka-bis-s-c-dy...5-1/?type=local

W pierwszym linku mamy 42-286 Koszęcin, Cegielniana 15, woj. śląskie czyli nasz wzorzec będzie wyglądał następująco jeśli chodzi o strukturę: 'kod'.'miasto'.'ulica'.'wojewodztwo'

a w drugim jest: 42-202 Częstochowa, woj. śląskie czyli 'kod'.'miasto'.'wojewodztwo' czyli brak jest ulicy i w tym miejscu skrypt będzie sypał błędami Undefined offset: 0....

I teraz chcę aby jeśli brakuje jakiejś rzeczy tzn. np ulicy albo email to żeby wyświetlało mi dane tylko te które są a tam gdzie ich nie ma po prostu puste pole zostawiało...

Może wizualnie biggrin.gif

nospor
? sluzy do okreslania ze cos moze byc ale nie musi

......(cos co jest ale nie musi byc)?......
Turson
Bez nawiasu tongue.gif
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.