[regexp] polaczyc dwa wyrazenia za pomoca "OR"

0

czesc,
mam problem z "alternatywa" w php'owych regexpach, zawsze myslalem ze to [a|b] (czyli a lub b), nie wiem - moze w takim przypadku powinno byc inaczej. chce pobrac piosenki i wykonawcow z http://www.rmf.fm/au/?a=poplista

preg_match_all('#<A HREF="/muzyka/bio/\?id=\d+">(.*?)<BR><BR>#s', $in, $in);

pobiera tylko 3 pierwsze (inaczej wyswietlane od reszty). Dla reszty działa:

preg_match_all('#<TD width=448><A HREF="/muzyka/bio/\?id=\d+">(.*?) &nbsp;#s', $in, $in);

probowalem polaczyc je tak, aby wyszukiwac zarowno te wyroznione, jak i normalne (poprzez [a|b]) ale ostatecznie coś nie bardzo mi wychodzilo. jak to wykonac?

dzieki.

0

[a|b] oznacza dopasowanie dowolnego znaku z zestawu "ab|". Zapewne chodzi Ci o
(wersja1)|(wersja2) [nawiasy dla czytelnosci/grupowania, warto dodać na ich poczatku ?: zeby nie lapalo tekstu w nich]

0

dzieki. niestety nadal mam problem z uzyciem tego w praktyce (jak to zrobic w moim przykladzie?)

0

Dla samych kawałków to powinno wyglądac mniej więcej tak:
#id=\d+">(.+)</A>: (.+)<BR>#Ui
Nie potrzebnie stosujesz dopasaowania obszerne, które są domyślnie.
P.S.
Nie wiem czy działa nie chce mi się testować :D

0

#id=\d+">(.+?)</A>: ([^&<]+?)#i (jak powyzsze zadziala, to to zlapie obie wersje)

0

dzieki, rozwiazalem to tak:

#bio/\?id=\d+">(.+?)</A>: (.+?)[&<]#i
(cos Twoja wersja @nav nie do konca dzialala)

Aha i tak jak w pierwszym poscie, pobieram i wykonawce i piosenke razem, np.:

Blue Cafe</A>: Niewiele mam
rozwiazalem to tak:

#bio/\?id=\d+">(.+?)[&<][nB]#
mam takie pytanie - czy to eleganckie? moze da sie jakos ladniej? (co, kiedy ciag jest dluzszy i nie starczy dopasowac dwoch pierwszych znakow)

PS. jaka jest roznica miedzy (.*) a (.+) ?
PS2. jaka jest roznica miedzy s, i a Ui na koncu regexow (np. #reg#i)?

0

Kropka oznacza jakikolwiek znak
(.*) - może wystąpić, nie musi
(.+) - musi wystąpic przynajmniej jeden

Literki "s, U, i" to modyfikatory:
i - oznacza, że nie brana jest pod uwage wielkość liter podczas przyrównywania do wzorca
s - . pasuje również do \n (kropka pasuje również do znaku nowej linii)
U(duże u) - zmienia zakres dopasowana z obszernych na ograniczone (Greedy - non-greedy), zobacz na przykładzie:

preg_match_all('#{(.+)}#','aaa {bbb} ccc {ddd} eee',$match);
print_r($match);
preg_match_all('#{(.+)}#U','aaa {bbb} ccc {ddd} eee',$match);
print_r($match);

Znak # czy / ograniczaja wzorzec.

Są tez inne modyfikatory:
m - interpretacja po kolei wszystkich wersów napisu - ^ oraz $ oznaczają początek oraz koniec wersu
x - ignorowanie białych znaków (\s), wyrażenie reg. może zawierać komentarze (komentarz jest interpretowany od znaku # do znaku końca linii)
u(małe u) - kodowanie w utf-8
A - kotwica ^ pasuje wyłącznie do początku napisu
D - kotwica $ pasuje wyłącznie do końca napisu
e - umożliwia używanie funkcji php (tylko preg_replace)

0

dzieki za wyjasnienie:)

0

preg_match_all('#/muzyka/bio/?id=\d+">(.+?)</a>: ([^&<]+)#si', $in, $out, PREG_SET_ORDER);
Przetestowane i działa.

henry napisał(a)

rozwiazalem to tak:
#bio/\?id=\d+">(.+?)[&<][nB]#
mam takie pytanie - czy to eleganckie?

Jakie by nie bylo, zadziała tak jak chcesz, złapie dowolną opcję z następujących: &n, &B, <n, <B (a chciałeś tylko 2 z nich, nie wszystkie 4), tu lepiej użyć po prostu ( |
).</b>

1 użytkowników online, w tym zalogowanych: 0, gości: 1