Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Regular Expression - zagnieżdżanie []*
Forum PHP.pl > Forum > Przedszkole
jimmix
Witam,

Mam serię tabel jenda po drugiej jako daną wejściową. Każda z tabel zawiera kilka podstawowych informacji typu nazwa, adres www, opis, itp. Chcę wyciągnąć z pliku źródłowego wszystkie te informacje za pomocą wyrażenia regularnego i wrzucić do bazy danych.
Używam do tego celu funkcji:
  1. preg_match_all($pattern, $subject, $result, PREG_SET_ORDER);

Gdy zastosuję wzorzec do wyciągnięcia informacji z wierszów tabel zawierających link do www:

  1. $pattern = '#';
  2. $pattern .= 'WWW.*?<a.*?>(.*?)</a>';
  3. $pattern .= '#';


Wzorzec działa poprawnie, tam gdzie pole www jest w tabeli uzupełnione to znajduje link a jak pole jest puste to nie przeszkadza to w wszukaniu następnych pól.

Wzorzec dla wszystkich pól jednej tabeli wygląda tak

  1. $pattern = '#';
  2. $pattern .= 'Nazwa.*?<p>([^<]*)</p>.*?';
  3. $pattern .= 'WWW.*?<a.*?>(.*?)</a>.*?';
  4. $pattern .= 'Opis.*?<p>([^<]*)</p>';
  5. $pattern .= '#';


Wzorzec ten działa ale niestety pojawia się tutaj problem gdy napotka on tabelę która będzie miała pole WWW puste. Wówczas brak jest dopasowania do tabeli i jedyne co zwraca to wyniki do momentu napotaknia tabeli bez linku www.

Próbowałem zmienić ten wzorzec ujmując całą kotwicę zawierającą link w warunek 0 lub więcej []* ale niestety zmiana wzorca na:
  1. $pattern = '#';
  2. $pattern .= 'Nazwa.*?<p>([^<]*)</p>.*?';
  3. $pattern .= 'WWW.*?[<a.*?>(.*?)</a>]*.*?';
  4. $pattern .= 'Opis.*?<p>([^<]*)</p>';
  5. $pattern .= '#';


nic nie zmienia.

W związku z tym chciałbym się zapytać

1.Czy można zagnieżdżać *?
2.Jak można rozwiązać powyższy problem
zegarek84
porównując dwie linijki
'WWW.*?<a.*?>(.*?)</a>.*?';
'WWW.*?[<a.*?>(.*?)</a>]*.*?';
zapewne chodziło Ci o coś w stylu
Kod
'WWW.*?(?:<a.*?>(.*?)</a>)?.*?';

czyli nawiasy gdzie nie jest przypisana zawartość do tablicy (?:)

luknij jeszcze na (?!) i (?=) - czasami mogą się bardzo przydać...

a do html'a nie stosuj wyr. reg. a DOM który także jest w php lub w google sobie wstukaj phpquery
jimmix
Dzięki, pomogło choć dodawaniu kolejnych podwyrażeń do nie zawsze chce działać, zmieniam kierunek na DOM - przyznaję Reg. Ex. nie są najlepszym pomysłem smile.gif
by_ikar
Takie wyrażenie jeszcze można zapisać w taki sposób:

Kod
#Nazwa.*?<p>([^<]*)</p>|WWW.*?[<a.*?>(.*?)</a>]|Opis.*?<p>([^<]*)</p>#


I przy odpowiednim zapisie będzie działać jako coś w rodzaju switcha z php. Nie mniej, do html wolę stosować DOM'a. wink.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.