Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] wyrazenia regularne
Forum PHP.pl > Forum > Przedszkole
alpin
Witam, mam taki problem, wyciagam sobie pewne dane za pomoca preg_match_all, kod wyglada nastepujaco:
  1. <?php
  2. if( preg_match_all( '/<p style=\"text-align:justify\">([^<]+).</p></li>/', $data2, $out2 ) )
  3. {
  4. $info[ 'dane' ] = $out2[ 0 ];
  5. }
  6. ?>

i moj problem wyglada nastepujaco, jezeli w tych danych znajduja sie jakies znaczniki html to mi to nie dziala, przynajmniej tak mysle, ze to przez to, bo gdy jest czysty tekst to pobiera ladnie, a jak pojawia sie tylko w zrodle <br> lub jakis inny znacznik html to lipa... ma ktos pomysl jak to rozwiazac ?

Z gory dziekuje za podpowiedzi!
Wicepsik
Czytałeś jakiś kurs?

([^<]+) - Wszystkie znaki oprócz znaku <
zegarek84
...oprócz lub do znaku jesli wyrażenie regularne jest dłuższe - jeśli coś jest do dopasowania dalej to raczej zalecałbym jeśli nie wiesz jakim znakiem ograniczyć coś "leniwego" - nie pamiętam jak to się nazywało ale:
(.+?)
alpin
Niestety dalej nie moge rozwiazac swego problemu. Moze podam przykladowy wzorzec z ktorego chce cos wyciagnac
  1. <li><p style="text-align: justify;">
  2. dane do pobrania ... <br> jakies dane <br> dalej dane .. <a class="internal" href="http://www.xxx.pl/123/456" title="nazwa">nazwa</a>) jakis tekst <br> <br>.
  3.  
  4. </p></li>


i chce pobrac wszystko pomiedzy <li><p style="text-align: justify;"> a </p></li>

probowalem tak
  1. <?php
  2. if( preg_match_all( '#<p style=\"text-align:justify\">(.+?)</p></li>#', $data2, $out2 ) )
  3.     {
  4.      $info[ 'dane' ] = ($out2[ 0 ]);
  5.      
  6.     }
  7. ?>

ale nie dziala mi to sad.gif
athei
Nie zadziała Ci bo co innego masz we wzorcu a co innego masz wpisane w preg_match_all.
Porównaj <p style="text-align: justify;"> a <p style=\"text-align:justify\"> (brak średnika, brak spacji).
Dodatkowo musisz użyć modyfikatora Dotall (s), który sprawi że . (kropka) będzie oznaczała wszystkie znaki, także znak nowej linii.
zegarek84
patrz pierwsze gdzie masz jeszce spacje i drugie gdzie jej nie ma - a i w pierwszym jest jeszcze ";":
text-align: justify; != text-align:justify

skożystaj np. z takiego wyrażenia - a inne zależy od sytuacji ;p (nie wiem też czy nie masz na pewno w kodzie spacji pomiędzy znacznikami html więc odniosę się dla samego znacznika <p...>...</p>):
'/<p[^>]*>(.+?)<\/p>/is'

jeśli masz pytanie co znaczą te is na końcu wyrażenia regularnego to: Pattern Modifiers (w końcu nie wiem czy w kodzie nie masz gdzieś enterów bądź większą literą np. P napisane ;p)

co do sprawdzenia wyjścia i czy coś przechwyciło urzyj:
echo '<pre>'; print_r($out); echo '</pre>';

edit - za długo otwarta karta jak czytałem inne tematy - ubiegli mnie ;p
alpin
Akurat z ta spacja to dziwna sprawa jest, bo w kodzie zrodlowym wystepuje po text-align, ale w wyrazeniu jak ja dam to wogole mi to niedziala, a jak ja usuna to chociaz cokolwiek mi pobiera... oto dowod :
  1. <?
  2. function opisy( $adres )
  3. {
  4.  $info = array();
  5.  $data   = file( $adres );
  6.  
  7. if( count( $data ) > 0 )
  8. {
  9.    $data = implode( $data );
  10.        if( preg_match( '#<h2 id="o-filmie-header" class="replace">[^<]+<span></span></h2>s+<p>[^<]+s+<a href="([^<]+)" title="#', $data, $out ) )
  11.        {
  12.           $data2 = implode( '', file( $out[ 1 ] ) );
  13.        }
  14.      if( preg_match_all( '#<p style=\"text-align:justify\">([^<]+)</p></li>#', $data2, $out2 ) )
  15.     {
  16.      $info[ 'opisy' ] = ($out2[ 0 ]);
  17.     }
  18. }
  19.  return $info;
  20. }
  21.  
  22. $adres="http://www.filmweb.pl/f699/Sara,1997";
  23.  
  24. print_r (opisy($adres));
  25. ?>

sam juz glupieje, probowalem na rozne sposoby ale pobiera mi tylko "czyste" opisy, a jak tylko w ktoryms w kodzie jest jakis znacznik html to niechce mi go pobrac, wiem ze wina tkwi w tym [^<]+ ale piszac inne wzorce wogole mi nie dziala ...

docelowo powinno mi pobrac wszystkie te opisy http://www.filmweb.pl/f699/Sara,1997/opisy no ale jak widac pobiera tylko 3 z 6 .. sad.gif
zegarek84
a próbowałeś wogóle mojego wyrażenia?? - i napisałem co używać zamiast ([^<]+) - ps. nie chce mi się testować wyrażenia ale skoro używasz coś takiego s+ (co znaczy jedno lub więcej liter "s" to jak to chcesz dopasować?)

co do spacji - białych znaków to używa się "\s"
\s - znak spacji, tabulacji lub nowego wiersza
...choć jeśli wyrażenie regularne było w pojedynczym apostrofie to można było używać spacji albo w PHP albo w js - nie pamiętam i nie chce mi się sprawdzać...

poza tym do parsowania stron to ja osobiście polecam DOM - wczytywaną stronę poprzedź @ by nie wyświetliło Ci błędów....

[edit] - oki - popatrzałem w kod strony i wyrażenie jakiego szukasz aczkolwiek nie chce mi się sprawdzać ale na 99% jest to (i w kodzie źródłowym w tym miejscu co piszesz nie ma spacji ;p):

'/<li><p\sstyle="text-align\:justify">(.+?)<\/p><\/li>/is' - jeśli jest to w pojedynczym apostrofie to podwójny w środku nie musisz poprzedzać backslashem - dwukropek chyba tutaj nie trzeba poprzedzać ale wg. niektórych kursów i w niektórych sytuacjach trzeba to i Tobie tu poprzedziłem co nie zaszkodzi...

a i wyswietl sobie całą tablicę tak jak pisałem bo chyba wyświetlasz sobie całe dopasowania do wyrażenia regularnego a nie zmienną będącą wewnątrz dopasowania (czyli nie to co w nawiasie - ale nie jestem pewien i mi się nie chce sprawdzać ;p)
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.