Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyrażenia regularne
Forum PHP.pl > Forum > PHP
balgareth
Witam

Niestety po przeszukaniu forum oraz dokumentacji od wyrażeń regularnych nie potrafie poradzić sobie z jednym problemem. Mam stronę internetową Strona na której jest jedno pole select, w którym wybieramy miejscowość, a następnie pojawiają nam się adresy biur podróży. Chciałbym pobrać te adresy dla wszystkich miast które można wybrać w selecie. Jak narazie udało mi się to osiągnąć częściowo poprzez wyrażenie:

  1. <?php
  2. preg_match_all( '/<br>([tel.:,a-z,0-9,A-Z,Ż,Ź,Ć,Ń,Ł,Ś,Ą,Ę,Ó,ż,ź,ć,ń,ł,ś,ą,ę,ó,.,-,(,),/,,, *]*)/', $strona , $b );
  3. ?>



Lecz nie znajduje np wyrażenia "Rynek 25" z miasta Brzesko oraz wielu innych. Niestety nie wiem dlaczego tak się dzieje. Proszę więc o pomoc jak można by to napisać inaczej lub jak to przerobić by chwyciło wszystkie nazwy biur, adresy, telefony.

Pozdrawiam
kubarek
spróbuj dodać \s do wyrażenia regularnego - dopasuje wtedy białe znaki ( spacje, etc. ), więc 'Rynek 25' też powinien znaleźć
balgareth
Niestety nie pomogło nadal jest to samo.

Jeszcze jakies pomysły ?
Michal2000
Cytat(balgareth @ 26.03.2007, 11:20:31 ) *
  1. <?php
  2. preg_match_all( '/<br>([tel.:,a-z,0-9,A-Z,Ż,Ź,Ć,Ń,Ł,Ś,Ą,Ę,Ó,ż,ź,ć,ń,ł,ś,ą,ę,ó,.,-,(,),/,,, *]*)/', $strona , $b );
  3. ?>


Znaków w wyrażeniu regularnym nie oddziela się znakiem przecinka. Gwiazdka oznacza wielokrotne lub żadne powtórzenie się danego wyrażenia i powinna być umieszczana po wyrażeniu regularnym. Wiec usuń ją z środka wyrażenia (tzn pomiędzy []). Poza tym, lepszy by był znak + który oznacza powtórzenie jeden, lub więcej razy. Jeśli chodzi o polskie znaki, to mogą być problemy z kodowaniem. Strona jest kodowana w ISO a notatnik (jesli w nim piszesz) zapisuje domyślnie w Windows-1250. Dlatego powinieneś sprawdzić kody polskich znaków w ISO i może wyświetlić je za pomocą funkcji ord().
Na początku wyrażenia piszez 'tel.:' co nie oznacza, że będzie szukał ciągów zaczynających sie od tel, a ciągów które zawierają w sobie znaki 't', 'e', 'l', '.', ':' ale w obojętnej kolejności. Znaki ( i ) są znakami specjalnymi, więc w wyrażeniu powinieneś poprzedzić je ukośnikiem. Ogólnie dziwie się, że tobie zwróciło to jakieś dane.

Spróbuj coś takiego, kod zbyt piękny nie jest, ale pisany na szybko był:

  1. <?php
  2. preg_match_all( '/<img src=images/st1.gif border=0>([[:print:]]+)n</nobr>n</td>n<td class="text_body" width=60% valign=top align=left>n<table>n<tr><td class="menu" valign=top align=left>([[:print:]]+)</td></tr>n<tr><td class="text_body" valign=top align=left>([[:print:]]+)</td></tr>n<tr><td class="text_body" valign=top align=left>([[:print:]]+)</td></tr>n<tr><td class="text_body" valign=top align=left><a href="mailto:([[:print:]]+)">/', file_get_contents('http://www.pbp.com.pl/index.php?page=10&sk=agenci') , $b );
  3. print_r($b);
  4. ?>
balgareth
Nie do końca o to mi chodziło gdyż ten kod pasuję do adresów na głównej stronie, które pokazują się za każdym razem a mi bardziej chodziło o te które pojawiają się po wybrania miasta w liscie rozwijanej na samym dole strony. Ale narazie dziękuje może po poprawieniu błedów uda mi się dojść do ładu z tym.
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.