Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyrażenia regularne jako pomoc w odszukaniu fragmentu strony
Forum PHP.pl > Forum > Przedszkole
Cypherq
Problem jest mniej więcej taki: mamy sklep, np: maximedia.pl
Wybieramy jakiś produkt, np: TEN

Strona z urządzeniem zawiera tabelkę (podam tylko fragment):

Kamera
Przetwornik obrazu rozmiar: Przetwornik obrazu ClearVid CMOS 1/3,0
Przetwornik obrazu system: Progresywny
14-bitowy przetwornik DXP: TAK
Technologia Advanced HAD: NIE
Liczba pikseli brutto (tys.): 3200
Efektywna liczba pikseli w trybie kamery (tys.): Tryb 16:9; 2280 / Tryb 4:3; 1710
Efektywna liczba pikseli w trybie aparatu (tys.): Tryb 16:9; 2280 / Tryb 4:3; 3040
Nastawianie ostrości automatyka w pełnym zakresie: TAK
Nastawianie ostrości ręczne: TAK
Przycisk ręcznego nastawiania ostrości: Panel

Jak wydobyć tylko źródło tej tabelki? Próbowałem wyrażeniami regularnymi, ale tabela nie ma (tak mi sie wydaje) żadnych znaków szczególnych. Nie da się więc ich łatwo znaleźć, czy ktoś ma jakiś ciekawy pomysł?
webdice
Nie żartuj nawet. Dla Ciebie uchwytem będzie:

  1. <table width="100%" border="0" cellpadding="2" cellspacing="1">


i

Cypherq
Fakt, przy pierwszym się nie zastanowiłem. Jednak przy drugim, znajdę również końcówki innych tabel (bo w końcu operuje na całym źródle). Tak czy siak dzięki za pomoc.
-Cypherq-
Rany, głupio tak, ale coś te wyrażenia regularne nie wchodzą do głowy. Jak zamienić za pomocą preg_replace():

  1. <?php
  2. <tr rozneparamentry=roznychwartosci>
  3. ?>
(analogicznie z <td> i <table>)

na

  1. <?php
  2. <tr>
  3. ?>
(czyli znaczniki bez parametrow)

żeby nie było, że proszę o gotowe to próbowałem już tak:

  1. <?php
  2. preg_replace('/^<table[a-zA-Z0-9.=\"]*>$/', '<table>', $site);
  3. ?>


Jednak i kilka innych sposobów, niestety nie dzieje się nic, a ja czytam kolejny artykuł o regexpach i nie wyciągam z niego widocznie odpowiednich wniosków. Pomożecie?
Cypherq
Mam nadzieję, że nie dostanie mi się za posty pod postami własnymi, ale przez pomyłkę napisałem jako gość i nie mogę posta edytować. Działa mi taka prosta konstrukcja:

  1. <?php
  2. preg_replace("/<table.*>/", '<table>', $site);
  3. ?>


Gdy próbowałem tak:
  1. <?php
  2. preg_replace("/^<table.*>$/", '<table>', $site);
  3. ?>


Nie działało. Czemu początek i koniec wyrażenia blokował działanie? Źle zrozumiałem zasadę ich funkcjonowania?
webdice
  1. <?php
  2. preg_replace ('#<table ([^>]+)#', ,);
  3. ?>


Kod
([^>]+)


Czyli wszystko aż do napotkania znaku >.
Cypherq
Ale wtedy > zostanie i wyjdzie ostatecznie <table>>
webdice
Myślenie nie boli smile.gif.

  1. <?php
  2. preg_replace ('#<table ([^>]+)>#', ,);
  3. ?>
Cypherq
Tylko nie obrażę Cię jeśli zapytam "czemu tak"? Czyli jak to działa?

Post pod postem, ale po dłuższej przerwie a pytanie zgadza się z tematem. Mianowicie, próbuję rozwiązać problem następujący:

W kodzie HTML strony znajduje sie N linków do produktów. Linki te mają niepowtarzalną w innych fragmentach kodu konstrukcję (<a class="produkt" -> klasa ta nie powtarza się w innych miejscach). Jak wydobyć je, tzn. usunąć całą resztę kodu oprócz linków? Chodzi mi raczej o wyjaśnienie krokowe, ew. podpowiedź co do użycia konkretnych funkcji, które mogą mi tutaj pomóc.
nowotny
Ja nie rozumiem dlaczego na siłę starasz się zastosować preg_replace" title="Zobacz w manualu PHP" target="_manual kied preg_match_all" title="Zobacz w manualu PHP" target="_manual bedzie znacznie lepszym wyjsciem...
  1. <?php
  2. preg_match_all("#<a class=\"produkt\" .+>.+</a>#U", $tekst, $wyniki);
  3. print_r($wyniki);
  4. ?>


I zobacz sobie co zawiera tablica $wyniki... BTW, przydałby się trochę dłuższy ciąg do porównywania...
sobstel
Myślę, że lepszy by tu mogło być zastosowanie DOM" title="Zobacz w manualu PHP" target="_manual, loadHTML i potem kolejnych metod przetwarzających.
Cypherq
Serdecznie dziękuję za pomoc. Pomysł Novotnego sprawdził się, chociaż zawierał literówkę:

  1. <?php
  2. preg_match_all("#<a class=\"produkt\" .+>.+</a>#U", $tekst, $wyniki);
  3. print_r($wyniki);
  4. ?>


Czyli brak backslasha przed /a> smile.gif

Twoja uwaga na temat niepotrzebnego zastosowania preg_replace jest bardzo słuszna, głównie po to kombinuję z regularnymi, żeby lepiej znać ich zastosowanie. Btw. po wpisaniu preg w wyszukiwarkę funkcji w manualu, preg_math_all nie wyskakuje, a link jest w preg_math, ale go przeoczyłem :]
nowotny
Cytat(Cypherq @ 5.02.2008, 10:57:50 ) *
Czyli brak backslasha przed /a> smile.gif

OIMW slasha nie trzeba eskejpować... :/
Cypherq
Łe? No chyba jednak tak, skoro wywala mi błąd o nieznanym modyfikatorze "a"...
nowotny
Cytat(Cypherq @ 5.02.2008, 11:15:09 ) *
Łe? No chyba jednak tak, skoro wywala mi błąd o nieznanym modyfikatorze "a"...

No jeśli używasz slashy do delimitowania wyrażenia to tak... ale ogólnie slasha sie nie eskejpuje...
Cypherq
Czyli lepiej używać np. # jako delimitera? Kurde, a ja eskejpowałem każdego slasha :/
nowotny
Ja hołduję zasadzie że najlepiej używać takiego znaku jakiego nie ma w patternie żeby się za dużo nie naeskejpować bo wtedy wyrażenie robi się mało przejrzyste... smile.gif ja najczęściej używam hasha (#) ale stosuje też inne, zależnie od potrzeby...
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.