Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Funkcja preg_match
Forum PHP.pl > Forum > PHP
blackroger
Dzień dobry. Mam problem z dostosowaniem funkcji preg_match.
Kod
<a class="end" href="/events?ga_type=events&ga_search=home&q=home&sort_order=Event&page_number=1995">1995</a>


Potrzebuję generalnie tylko samą wartość 1995 umieszczoną pomiędzy znacznikami. Stała jest tylko cześć:

Kod
<a class="end" href="...............................................................">liczba</a>


Mógłby ktoś mi pomóc jaki wzor tu zastosowac?
dsk
preg_match('|<a class="end" href=".+">(.+)</a>|U',

powinno dzialac
blackroger
Wielkie dzięki. Działa... tylko jakbyś mógł jeszcze opowiedzieć o tym U na końcu, bo nigdzie nie mogę znaleźć. I jeszcze pytanie jak szukać wzorca ale tylko do pierwszej spacji np. <cosc>cos cos2</cos> tak żeby wzięło tylko cos. Z góry dzięki.
erix
Cytat
Wielkie dzięki. Działa... tylko jakbyś mógł jeszcze opowiedzieć o tym U na końcu, bo nigdzie nie mogę znaleźć.

http://www.php.net/reference.pcre.pattern.modifiers
johnson
Cytat(blackroger @ 16.11.2008, 18:26:45 ) *
I jeszcze pytanie jak szukać wzorca ale tylko do pierwszej spacji np. <cosc>cos cos2</cos> tak żeby wzięło tylko cos. Z góry dzięki.


na moje oko coś takiego:

  1. <?php
  2. $string = '<a class="end" href="/events?ga_type=events&ga_search=home&q=home&sort_order=Event&page_number=1995">1995 aaa</a>';
  3. preg_match('|<a class="end"[^>]+>([^ ]+) ?.*</a>|', $string, $matches);
  4. // pokaz wyniki
  5. echo('<pre>');
  6. echo(print_r($matches));
  7. echo('</pre>');
  8. ?>
blackroger
Dziękuję za odpowiedzi. Mam jeszcze pytanie, gdyż nie mogę znaleźć odpowiedzi na dręczące pytanie. Niektórzy stosują znaki |, a niektórzy / na początku i na końcu wyrażenia...Czy m to się różni...Wiem że "|" to alternatywa ale co to ma tutaj do rzeczy?
erix
Oddzielają one wyrażenie od modyfikatorów.

Ja na przykład stosuję hashe (#). winksmiley.jpg
blackroger
Mam jeszcze jedno pytanie i jak ktoś znałby odpowiedź to byłbym wdzięczny.
Problem jest mianowicie taki:
Mam źródło :
  1. <tr class="first ">
  2. <td class="photo"><a href="/waltham/events/womens-basketball-vs-husson-college-home-/E0-001-006386976-2"><img class="event-img" src="http://static.eventful.com/images/thumb/I0-001/000/500/442-6.jpeg"
  3. title="Women's Basketball vs Husson College at HOME"></a></td>
  4. <td class="event-info">
  5. <h3>
  6. <a href="/waltham/events/womens-basketball-vs-husson-college-home-/E0-001-006386976-2">Women's Basketball vs Husson College at HOME</a><span class="no_hover action-item action-item-inactive"
  7. alt="E0-001-006386976-2"><img src="/images/transparent.gif" height="13" width="13" /><div class="action-item-hover object-add"><span class="action-copy">Add to Favorites</span></div><div class="action-item-hover object-remove"><span class="action-copy">Added - <a href="/my">View Favorites</a></span></div></span> </h3>
  8. <h4></h4>
  9.  
  10. <h5> Waltham, MA </h5>
  11.  
  12. <a href="/waltham/events/womens-basketball-vs-husson-college-home-/E0-001-006386976-2">View event details</a>
  13. </td>
  14. <td class="event-date">
  15. <strong>Jan 5, 2009 </strong>&nbsp;&nbsp; 1:00 pm
  16.  
  17. </td>
  18. </tr>
  19. pomiędzy tymi klasami znajduje się wiele klas o nazwie " "
  20. <tr class=" ">
  21.  
  22. informacje
  23. </tr>
  24. ...........................
  25. <tr class=" last">
  26.  
  27. .......................
  28. </tr>


Moim celem jest wyciągnięcie (na przykładzie pierwszej klasy a w późniejszej fazie następnych, bo jet podobna struktura):
  1. <a href="/waltham/events/womens-basketball-vs-husson-college-home-/E0-001-006386976-2">

Próbowałem już chyba wszystkiego...
Najpierw starałem się wyodrębnić chociaż całą tą sekcję kodu
  1. <tr class="first "> dwsad</tr>

używając
  1. <?php
  2. preg_match('|<tr class="first ">(.+)</tr>|', $zrodlo, $link);
  3. ?>

ale nie wyświetla nic, później dodałem "is" na końcu i wyświetlało od <tr class="first "> az do ostatniego </tr> w całym dokumencie. Moim zdaniem problem leży w białych znakach i nowych liniach w źródle, tylko nie wiem jak się go pozbyć. Wiem że trzeba ułożyć właściwy wzorzec ale w dokumentacji funkcji nie ma za wiele o takich przypadkach. Gdyby ktoś chciałby mi pomóc lub znaleźć inne rozwiązanie to czekam. Próbowałem użyć fopen i jak wiadomo zadziałał ale to nie jest chyba za efektywny parser a informacji jest tam sporo. Źródło jest mniej więcej w takiej postaci jak przedstawiłem (spacje, białe znaki, nowe lini itd) Dzięki z góry za odpowiedź.
johnson
W tym przykładzie wyodrębnia wszystko co jest między <tr class="first "> a </tr>, czyli całą klasę first. Tak naprawdę nie wiem co chcesz uzyskać z tego ciągu, czy linki czy może coś innego?

  1. <?php
  2. $string = '
  3. <tr class="first ">
  4. <td class="photo"><a href="/waltham/events/womens-basketball-vs-husson-college-home-/E0-001-006386976-2"><img class="event-img" src="http://static.eventful.com/images/thumb/I0-001/000/500/442-6.jpeg"
  5. title="Women's Basketball vs Husson College at HOME"></a></td>
  6. <td class="event-info">
  7. <h3>
  8. <a href="/waltham/events/womens-basketball-vs-husson-college-home-/E0-001-006386976-2">Women's Basketball vs Husson College at HOME</a><span class="no_hover action-item action-item-inactive"
  9. alt="E0-001-006386976-2"><img src="/images/transparent.gif" height="13" width="13" /><div class="action-item-hover object-add"><span class="action-copy">Add to Favorites</span></div><div class="action-item-hover object-remove"><span class="action-copy">Added - <a href="/my">View Favorites</a></span></div></span> </h3>
  10. <h4></h4>
  11.  
  12. <h5> Waltham, MA </h5>
  13.  
  14. <a href="/waltham/events/womens-basketball-vs-husson-college-home-/E0-001-006386976-2">View event details</a>
  15. </td>
  16. <td class="event-date">
  17. <strong>Jan 5, 2009 </strong>&nbsp;&nbsp; 1:00 pm
  18.  
  19. </td>
  20. </tr>
  21. pomiędzy tymi klasami znajduje się wiele klas o nazwie " "
  22. <tr class=" ">
  23.  
  24. informacje
  25. </tr>
  26. ...........................
  27. <tr class=" last">
  28.  
  29. .......................
  30. </tr>
  31. ';
  32. preg_match('|<tr class="first ">(.+)</tr>|sU', $string, $matches);
  33. // pokaz wyniki
  34. echo('<pre>');
  35. echo(print_r($matches));
  36. echo('</pre>');
  37. ?>


|sU oznacza w skrócie

s - kropka oznacza wszystkie znaki wraz ze znakiem nowej linii (bez tego kropka oznacza wszystkie znaki z wykluczeniem znaku nowej linii)
U - wyrażenie regularne nie jest zachłanne czyli szuka do pierwszego wystąpienia </tr>

mam nadzieję, że o to chodziło
blackroger
Wielkie dzięki...brakowało mi tego "U". Tak, chcę z każdej klasy pobierać link, tak jak napisałem wcześniej, zastanawiam się tylko teraz, jak ja będę odróżniał konkretne klasy (są takie same, ta sama nazwa class=" "). Bo generalnie chodzi o to że muszę z każdej klasy wyłuskać link, następnie wejść na ten link i coś znaleźć. Później przechodzę do następnej klasy wyszukuje link i to samo, a klasy tak samo się nazywają za wyjątkiem pierwszej i ostatniej.
johnson
Dobrze by było jakbyś napisał od początku do końca o co w tym wszystkim chodzi, bo na razie robimy jakieś pojedyncze rzeczy, a tak naprawdę nie wiemy do czego to prowadzi i co ma robić.
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.