Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: preg_match_all i alias tablicy (chyba można to tak nazwać)
Forum PHP.pl > Forum > PHP
linx
Witam,
jestem w trakcie przygotowywania skryptu z CURL.

Posiadam ciąg z którego chcę wyciągnąć dane i godzinę:
  1. <p class="tb_title">Tabela kursowa obowiązuje od dnia 20.02.2009 godzina 16:36</p>

Dane dają się wyciągną ale dal łatwości pisania skryptu chciałem skorzystać z aliasów (chyba tak można to nazwać)
http://pl.php.net/preg_match_all - > Przykład #3 Using named subpattern" title="Zobacz w manualu PHP" target="_manual
Kiedy chce wyciągnąć np godzinę:
  1. <?php
  2. preg_match_all('/<p.*?class="tb_title".*?>Tabela kursowa obowiązuje od dnia.*?godzina.*?(?<name>d++)*?</p>/', $wynik, $matches0);
  3. ?>

to wyświetla mi się:
  1. <?php
  2. [name] => Array
  3.        (
  4.            [0] => 36
  5.        )
  6. ?>

zamiast:
  1. <?php
  2. [name] => Array
  3.        (
  4.            [0] => 16:36
  5.        )
  6. ?>


bez względu na to czy dam: (?<name>\d++), (?<name>\d+), (?<name>\w++), (?<name>\w+) zawsze dostaje "[0] => 36".
Kiedy daje (?<name>\d), (?<name>\w) wtedy dostaje "[0] => 6"

Czy ma ktoś jakiś pomysłquestionmark.gif na mój problem??
Pozdrawiam.
adanti
ja bym to zrobiła nieco inaczej, np. tak:
CODE
preg_match_all('/(?<day>\d\d.\d\d.\d\d\d\d) godzina (?<hour>\d+):(?<min>\d+)/', $str, $matches);
linx
Zrobiłem to jeszcze inaczej
  1. <?php
  2. preg_match_all('/<p.*?class="tb_title".*?>Tabela kursowa obowiązuje od dnia.*?(?<dzien>dd.dd.dddd).*?godzina.*?(?<godzina>.*d:dd).*?</p>/', $wynikcurl, $tablica);
  3. ?>


Ale bardzo dziękuje za pomoc i pokazanie jak powinna być składnia.
Bo szukałem w manual`u ale nie mogłem nigdzie znaleźć opisu.
Teraz pytanie czy taka składnia jest porwana i czy tak może być (?<godzina>.*\d:\d\d)

Pozdrawiam
adanti
szczerze mówiąc nie jestem specjalistą od wyrażeń regularnych, składniowo chyba dobrze ale wydaje mi się, że trochę komplikujesz. może to Ci pomoże (mnie pomogło): wyrażenia reg.
linx
No dobra mam jeszcze jedne problem, mianowicie (kod html):

  1. <tr class="">
  2. <td width="30%">Australia</td>
  3. <td width="15%">DOLAR</td>
  4. <td width="17%">1 AUD</td>
  5.  
  6. <td width="12%">2.3338</td>
  7. <td width="15%">2.4706</td>
  8. <td width="12%">2.4022</td>
  9. </tr>
  10.  
  11. <tr class="">
  12. <td width="30%">Kanada</td>
  13. <td width="15%">DOLAR</td>
  14.  
  15. <td width="17%">1 CAD</td>
  16. <td width="12%">2.8924</td>
  17. <td width="15%">3.0622</td>
  18. <td width="12%">2.9773</td>
  19. </tr>


No i wiadomo chcę wyciągnąć wszystkie dane, tylko jest problem że wartości są w różnych liniach i nie do konca to działa. Stworzyłem taką formułę:
  1. <?php
  2. preg_match_all('/<tr.*class=\"\">.*?<td.*width=\"30%\">(.*?)</td>.*?<td.*width=\"15%\">(.*?)</td>.*?<td.*width=\"17%\">(.*?)</td>.*?<td.*width=\"12%\">(.*?)</td>.*?<td.*width=\"15%\">(.*?)</td>.*?<td.*width=\"12%\">(.*?)</td>.*?</tr>/', $wynikcurl, $tablica);
  3. ?>


Niestety przy takiej formule zwracana jest pusta tablica.
Grzebiąc w necie dodawałem dodatkowe inf. typu i, s, si

  1. <?php
  2. ....</tr>/[TUTAJ], $wynikcurl, $tablica);
  3. ?>


Ale efekt jest taki że przy s, si dostaje jakieś dziwactwa:

  1. <?php
  2. (
  3.    [0] => Array
  4.        (
  5.            [0] => <tr class="">
  6.                                <td width="30%">Australia</td>
  7.                                <td width="15%">DOLAR</td>
  8.                                <td width="17%">1 AUD</td>
  9.  
  10.                                <td width="12%">2.3338</td>
  11.                                <td width="15%">2.4706</td>
  12.  
  13.                                <td width="12%">2.4022</td>
  14.                        </tr>
  15.            
  16.            <tr class="">
  17.                                <td width="30%">Kanada</td>
  18.                                <td width="15%">DOLAR</td>
  19.  
  20.                                <td width="17%">1 CAD</td>
  21.  
  22.                                <td width="12%">2.8924</td>
  23.                                <td width="15%">3.0622</td>
  24.                                <td width="12%">2.9773</td>
  25.                        </tr>
  26.        )
  27.  
  28.    [1] => Array
  29.        (
  30.            [0] => Kanada
  31.        )
  32.  
  33.    [2] => Array
  34.        (
  35.            [0] => DOLAR
  36.        )
  37.  
  38.    [3] => Array
  39.        (
  40.            [0] => 1 CAD
  41.        )
  42.  
  43.    [4] => Array
  44.        (
  45.            [0] => 2.8924
  46.        )
  47.  
  48.    [5] => Array
  49.        (
  50.            [0] => 3.0622
  51.        )
  52.  
  53.    [6] => Array
  54.        (
  55.            [0] => 2.9773
  56.        )
  57.  
  58. )
  59. ?>


No i wartości są czytane tylko z drugiego <TR></TR>

Jak z tym sobie poradzić??
Czy ktoś ma jakiś dokładniejszy opis do preg_match, preg_match_all??

Pozdrawiam.
zegarek84
błąd - poczytaj na google o wyrażeniach regularnych i zachłanność wyrażeń regularnych, w pojedyńczym apostrofie wstawiając spację jest ona spacją a nie trzeba pisać \s winksmiley.jpg - popraktykój winksmiley.jpg:
Kod
$text='<tr class="">
<td width="30%">Australia</td>
<td width="15%">DOLAR</td>
<td width="17%">1 AUD</td>

<td width="12%">2.3338</td>
<td width="15%">2.4706</td>
<td width="12%">2.4022</td>
</tr>

<tr class="">
<td width="30%">Kanada</td>
<td width="15%">DOLAR</td>

<td width="17%">1 CAD</td>
<td width="12%">2.8924</td>
<td width="15%">3.0622</td>
<td width="12%">2.9773</td>
</tr>';

$preg = preg_match_all('/<tr class="">[^<]*?<td width="30%">([^<]*?)<\/td>[^<]*?<td width="15%">([^<]*?)<\/td>[^<]*?<td width="17%">([^<]*?)<\/td>[^<]*?<td width="12%">([^<]*?)<\/td>[^<]*?<td width="15%">([^<]*?)<\/td>[^<]*?<td width="12%">([^<]*?)<\/td>[^<]*?<\/tr>/s', $text, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>';
linx
Dzięki już wiem co źle robiłem.
A jeśli o programowanie to sam się uczę i ćwiczę i kombinuje.

Pozdrawiam i dzięki za pomoc.
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.