Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][HTML]Wyrażenie regularne w preg_match_all
Forum PHP.pl > Forum > Przedszkole
wicy
Przejrzałem już chyba wszystkie tematy, w wielu podawane przykłady są zupełnie różne od siebie.
Chodzi mi o wyłuskanie z kodu HTML fragmentu między znacznikami
Kod
<tr><td class='name'><BR>...<BR><td> ... różne kolumny ... </td><BR>...<BR></tr>

Kod Html zawiera różne inne śmieci z <tr> i <td> więc wzór wyrażenia w preg_match_all muszę zacząć od <tr>
<td class='name'> i skończyć </td></tr>.
Próbuję
Kod
<BR>$wzor="<tr><td class='name'>(.*)</tr></td>/s";<BR>

Ale dostaję błąd "Unknown modifier '<'"
Jak więc powinno wyglądać wyrażenie?
erix
Wpisz sobie ten znak jako parametr preg_quote" title="Zobacz w manualu PHP" target="_manual i zobaczysz, co trzeba zrobić. [;
Jifer
To tylko podstawy, ale napisane tak, ze bez problemu zrozumiesz.
http://pl.wikibooks.org/wiki/PHP/Podstawy_...%84_regularnych
większość znaków specjalnych w tym '<' '>' '/' musisz blokować przy pomocy '\'
dodatkowo wzorce preg muszą mieć / na początku i końcu np '/wzorzec/'

nie pamietam czy '=' i '>' też musi być blokowane. Nie dawaj 'name' tylko po ludzku "name" a całosć dawaj w ' a nie " po co Ci interpretacja tego? I po co Ci /s na końcu jak nie masz nic dalej?
tak na szybko, nie sprawdzałem tego.
$wzor='/\<tr>\<td class=\"name\">(.*)\<\/tr>\<\/td>/';
wicy
Nie bardzo mi to działa sad.gif
Konstruuję wzór:
$wzor="<tr><td class='name'>(.*)</tr></td>";
Daję name w cudzysłowie pojedynczym, gdyż taki znak zawiera string z kodem HTML.
Ubieram to w ograniczniki: $wzor="/<tr><td class='name'>(.*)</tr></td>/"; (wiele przykładów które widziałem przed <tr> sugerowało | albo nawet @)
Znaki specjalne < i / poprzedzam \: $wzor="/\<tr>\<td class='name'>(.*)\<\/tr>\<\/td>/";

I nic się nie dzieje - tzn funkcja preg_match_all nie wybiera nic sad.gif
Dla pewności daję znaki \ również przed =: $wzor="/\<tr>\<td class/='name'>(.*)\<\/tr>\<\/td>/";

Nie jestem pewniem, czy źródło między tagami html nie zawiera jakichś znaków (spacje, tab, cr/lf), może między nimi dać również (.*) ?

Oczywiście w zmiennej $wzór jest błąd kolejności tagów </tr></td>. Po zmianie otrzymuję "jakieś" wyniki. Kwestia tylko sprawdzenia czy poprawne, co wiąże się z innym problemem (usuwanie zbędnych tagów z html).

Tak więc analiza wyników wskazuje, że
$wzor="/\<tr>\<td class=\'name\'>(.*)\<\/td>\<\/tr>/s";
nie zwraca nic, co sugeruje, że między <tr> a <td class są jednak jakieś znaki, bo
$wzor="/\<tr>(.*)\<td class=\'name\'>(.*)\<\/td>\<\/tr>/s";
zwraca wyniki w miarę poprawne. W miarę bo "łapie" np. niepotrzebne tagi <tr><td align =... sad.gif

Jak więc poprawić $wzór by po <tr> sprawdził tylko spacje i tabulatory??
Wicepsik
  1. <?php
  2. preg_match_all('/<tr><td class='name'>(.*)</tr></td>/', $strona, $wynik)
  3. ?>
wicy
Cytat(Wicepsik @ 5.06.2009, 19:44:38 ) *
  1. <?php
  2. preg_match_all('/(.*)</tr></td>/', $strona, $wynik)
  3. ?>


No niestety. Nie ten kod - nie działa.

Działa $wzor="/\<tr>(.*)\<td class=\'name\'>(.*)\<\/td>\<\/tr>/s";
ale w wyniki "łapie" również takie teksty
Kod
<tr>
      <td align='center'

co mnie nie zadowala.
Czym zastąpić pierwszą (.*) w "/\<tr>(.*)\<td.... ?
erix
Kod
(.*?)

;]

PS. Zapomniałem - dodaj tag do tematu.
wicy
Też nie to sad.gif
$wzor="/\<tr>(.*?)\<td class=\'name\'>(.*)\<\/td>\<\/tr>/s";
działa dokłądnie tak samo jak bez "?".

Poproszę o innne podpowiedzi, bo już tracę nadzieję.
Wynik działania skryptu na stronie. Chodzi mi głównie o wydobycie tabeli z danymi. Niestety jeszcze parę śmieci pozostaje sad.gif
Wicepsik
Z jakiej strony chcesz pobrać dane i jakie to są dane.
wicy
Ze strony chcę pobrać czystą tabelę z danymi zawodników.
Jest to tabela z wierszami
Kod
      <tr>
<td class='name'>
        <a href='http://hockey.powerplaymanager.com/pl/profil-kraju.html?data=svk'><img src='http://images.powerplaymanager.com/ppm/flags/svk.gif' alt="Słowacja" title="Słowacja" width='16' height='10' style='vertical-align: middle' align='absMiddle' /> </a><a href='http://hockey.powerplaymanager.com/pl/zawodnik.html?data=43062-samuel-cmar'>Samuel Cmár</a>
        <div align='center' style='color: gray;'>
        20:53:57
           (<span id='offen_deadline_43062'></span>)
            <input type='hidden' value='11' id='time_offen_deadline_43062'>
             <script>
              runSeconds('time_offen_deadline_43062', 'offen_deadline_43062', "Zakończenie aukcji");
            </script>
          <br>
        Koszt: 500 000
        </div>
        </td>
        <td>16</td>
        <td><img src='http://hockey.powerplaymanager.com/_images/icon/scouted_n2.gif' title='Nieskautowany' alt='Nieskautowany' width='14' height='12' border='0'></td>
        <td>77</td>
         <td><span title='perfekcyjny = Maximum'>6/6</span></td>
   <td class='right'>12<span class='kva'>73</span></td><td class='right'>26<span class='kva'>70</span></td><td class='right'>12<span class='kva'>55</span></td><td class='right'>25<span class='kva'>96</span></td><td class='right'>29<span class='kva'>78</span></td><td class='right'>17<span class='kva'>57</span></td><td class='right'>28<span class='kva'>63</span></td>
         <td>2</td>
        <td>149</td>
        <td>R</td>
      </tr>

I właśnie chcę wyłuskać to co zaczyna się <tr><td class='name'> i kończy </td></tr>
Wicepsik
  1. <?php
  2. $plik = file_get_contents('http://hockey.powerplaymanager.com/pl/rynek-transferowy.html');
  3. $plik = strstr($plik, "<td class='name'>");
  4. $plik = substr($plik, 0, strpos($plik, "<script type='text/javascript' src='http:"));
  5. ?>

Potem sobie sformatuj tekst i wrzuć do tablicy worriedsmiley.gif
wicy
No tak... proste wstydnis.gif to po co ja się męczyłem z preg_match_all??
Fifi209
Przy preg_match_all polecam używanie flag.

Dodatkowo przy wyrażeniach regularnych ma znaczenie wielkość liter chyba że na końcu po / dodamy "i"

/[a-z]+/i (przykładowo [litery od a-z i A-Z])
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.