Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wyrażenia regularne w preg_match()
qdlaty88
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 2
Dołączył: 11.09.2013

Ostrzeżenie: (0%)
-----


Z kodu html książki telefonicznej chcę wyciągnąć ilość znalezionych pozycji, które zapisane są już na początku dokumentu:

  1. <meta name="description" content="11 256 wyników dla zapytania medycyna"/>


Dokładnie interesuje mnie ciąg znaków "11 256 wyników" i nic poza tym.
Ta liczba jest zależna od kryterium wyszukiwania, dlatego wyrażenie regularne ją odnajdujące powinno wyglądać tak:

  1. (\d+\s)+wyników


Powyższe wyrażenie działa na dostępnych w sieci testerach ale w mojej aplikacji do tablicy zapisuje jedynie "256 wyników" zamiast "11 256 wyników".
Kod odpowiedzialny za wyszukanie i wydruk:

  1. $patternResults = '/(\d+\s)+wyników/';
  2. preg_match($patternResults, $file, $matchesResults);
  3. var_export($matchesResults[0]);


A wydruk to "256 wyników"...
Gdzie się podziały te dwie jedynki?
Dodam, że jeśli tak spreparuję wyrażenie by preg_match() wyszukiwał adresy e-mail, linki do podstron czy liczby obojętnie jakie lub podobnej wielkości co ta z przykładu to wszystko działa. Tylko tej interesującej mnie informacji nie chce przegryźć...

Ten post edytował qdlaty88 11.09.2013, 13:30:14
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
_Borys_
post
Post #2





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

Ostrzeżenie: (0%)
-----


  1. preg_match('/(\d+\s?\d*) wyników/', $file, $matchesResults);
  2. print_r($matchesResults);
  3. echo '<br />'.(int)str_replace(' ', '', $matchesResults[1]);

a gdyby były liczby z kilkoma spacjami to bardziej właściwe będzie
  1. preg_match('/([\d\s]+) wyników/', $file, $matchesResults);


Ten post edytował _Borys_ 11.09.2013, 14:34:06
Go to the top of the page
+Quote Post
qdlaty88
post
Post #3





Grupa: Zarejestrowani
Postów: 21
Pomógł: 2
Dołączył: 11.09.2013

Ostrzeżenie: (0%)
-----


Niestety tak też nie działa. Na wydruku dostaję:
  1. Array ( [0] => 260 wyników [1] => 260 )
  2. 260

Wciąż brak dwóch pierwszych cyfr.
Jak zmienię kod na:
  1. preg_match_all('/(\d+\s)+/', $file, $matchesResults);

żeby sprawdzić czy w tablicy będzie interesująca mnie wartość, dostaję masę liczb ale nie tą której potrzebuję. Po wydrukowaniu zawartości zmiennej z wczytanym kodem widzę, że pojawia się ona w trzech miejscach. Nie mam już pomysłu jak wyciągnąć ilość wyników...

Zrobiłem to na około wykorzystując takie wyrażenie regularne:
  1. '/content=\".+wyników/'

Dostaję teraz ciąg:
  1. array ( 0 => 'content="11 248 wyników', )

Czyli już prawie to co chciałem (wygląda na to, że przerwa pomiędzy '11' a '248' to nie spacja. Jak to teraz wyczyścić, żeby dostać '11248'?
  1. echo '<br />'.(int)str_replace(' ', '', $matchesResults[0]);

daje na wydruku tylko liczbę '1'...
Go to the top of the page
+Quote Post
_Borys_
post
Post #4





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

Ostrzeżenie: (0%)
-----


$matchesResults[1] - tutaj masz samą liczbę ze spacją
Moje też działało, możliwe że jest więcej słów "wyników"
Spróbuj tak
  1. preg_match('/content=\"([\d\s]+) wyników/', $file, $matchesResults);

a str_replace(); tak jak wyżej podałem
Go to the top of the page
+Quote Post
qdlaty88
post
Post #5





Grupa: Zarejestrowani
Postów: 21
Pomógł: 2
Dołączył: 11.09.2013

Ostrzeżenie: (0%)
-----


  1. preg_match('/content=\"([\d\s]+) wyników/', $file, $matchesResults);
  2. print_r($matchesResults);
  3. echo '<br />'.(int)str_replace(' ', '', $matchesResults[1]); //To jest linnia 17

Daje na wydruku:
  1. Array ( )
  2. Notice: Undefined offset: 1 in /var/www/pkt_parser/process.php on line 17
  3.  
  4. 0

Sama ilość wyników w całym kodzie powtarza się trzykrotnie w różnym kontekście. Próbowałem już zmieniać ten kontekst. Problem tkwi w tej spacji dzielącej liczbę na dwie części. Jeśli do szukania wykorzystam wyrażenie:
  1. 'content=\"(\d+\s)+'

To dostaję: 'content="11'.
Dla:
  1. '(\d+\s)+wyników'

Mam '248 wyników'.
Wyrażenie:
  1. '(\d+\s)+'

Wyrzuca tablicę pełną różnych liczb znalezionych w kodzie ale nie ma wśród nich tej która jest mi niezbędna.
Ciekawe jest to, że jak wyświetlę źródło strony w przeglądarce i skopiuję interesujący mnie fragment do pliku, który później załaduję do zmiennej za pomocą file_get_contents() to moje wyrażenie działa. Jeśli proces odbywa się automatycznie, czyli pobranie strony, zapis do pliku, pobranie z pliku i przeszukanie to działa jak powyżej...
Kombinuję na wszystkie możliwe sposoby i nic...

Ten post edytował qdlaty88 12.09.2013, 12:05:46
Go to the top of the page
+Quote Post
_Borys_
post
Post #6





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

Ostrzeżenie: (0%)
-----


Pokaż co zwróciło print_r($matchesResults);
Go to the top of the page
+Quote Post
qdlaty88
post
Post #7





Grupa: Zarejestrowani
Postów: 21
Pomógł: 2
Dołączył: 11.09.2013

Ostrzeżenie: (0%)
-----


Tak jak wyżej:
  1. Array ( )

ale jak wyrażenie w preg_match() będzie wyglądać tak: '/content=\".+wyników/' to zwraca:
  1. Array ( [0] => content="11 248 wyników )
Go to the top of the page
+Quote Post
_Borys_
post
Post #8





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

Ostrzeżenie: (0%)
-----


A jak wygląda ta linia z liczbą w pliku ?
Spróbuj z modyfikatorem m
  1. preg_match('/content=\"([\d\s]+) wyników/m', $file, $matchesResults);


Ten post edytował _Borys_ 12.09.2013, 12:19:45
Go to the top of the page
+Quote Post
qdlaty88
post
Post #9





Grupa: Zarejestrowani
Postów: 21
Pomógł: 2
Dołączył: 11.09.2013

Ostrzeżenie: (0%)
-----


  1. <meta name="description" content="11 248 wyników dla zapytania medycyna - znajdź dane firm, adresy i telefony na PKT.PL - największe yellowpages w Polsce. - 1"/>

Problemem jest przerwa pomiędzy '11' a '248'. Wykasowałem tę przerwę i zastąpiłem ją spacją. Wczytałem plik do zmiennej i zatrybiło. Tam jest jakiś śmieć. Tylko jak się go pozbyć skoro nie wiadomo co to jest?
Go to the top of the page
+Quote Post
styryl
post
Post #10





Grupa: Zarejestrowani
Postów: 223
Pomógł: 27
Dołączył: 16.04.2008
Skąd: Bakutilu

Ostrzeżenie: (0%)
-----


  1. $string = '<meta name="description" content="11 256 wyników dla zapytania medycyna"/>';
  2.  
  3. $patternResults = '/(\d+?\s(\d+|wyników))/';
  4. preg_match($patternResults, $string, $matchesResults);
  5.  
  6. print_r($matchesResults);
  7.  
Go to the top of the page
+Quote Post
qdlaty88
post
Post #11





Grupa: Zarejestrowani
Postów: 21
Pomógł: 2
Dołączył: 11.09.2013

Ostrzeżenie: (0%)
-----


Modyfikator m niestety nic nie zmienia.
Go to the top of the page
+Quote Post
_Borys_
post
Post #12





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

Ostrzeżenie: (0%)
-----


  1. preg_match('/content=\"([\d\s]+) wynik/', $file, $matchesResults);

Jeśli to zadziała to masz coś nie tak z kodowaniem pliku.
Go to the top of the page
+Quote Post
qdlaty88
post
Post #13





Grupa: Zarejestrowani
Postów: 21
Pomógł: 2
Dołączył: 11.09.2013

Ostrzeżenie: (0%)
-----


Cytat(styryl @ 12.09.2013, 13:34:20 ) *
  1. $string = '<meta name="description" content="11 256 wyników dla zapytania medycyna"/>';
  2.  
  3. $patternResults = '/(\d+?\s(\d+|wyników))/';
  4. preg_match($patternResults, $string, $matchesResults);
  5.  
  6. print_r($matchesResults);
  7.  

Też tak robiłem i działało. Ale u Ciebie w $string pomiędzy '11' a '256' jest spacja, w kodzie jaki pobieram ze strony jest jakiś śmieć...

Cytat(_Borys_ @ 12.09.2013, 13:46:04 ) *
  1. preg_match('/content=\"([\d\s]+) wynik/', $file, $matchesResults);

Jeśli to zadziała to masz coś nie tak z kodowaniem pliku.

Wyrzuca pustą tablicę.
Zostawmy już te wyrażenia. Jeśli wyniku jaki daje mi '/content\"=.+wyników' nie da się wyczyścić to po prostu zrobię tak, że wyszukam najpierw 'content\"=\d+', później '\d+\swyników' i złożę to w jeden ciąg. Przynajmniej pozbędę się tej przerwy i dalej z górki (IMG:style_emoticons/default/wink.gif)

Ten post edytował qdlaty88 12.09.2013, 12:57:02
Go to the top of the page
+Quote Post
_Borys_
post
Post #14





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

Ostrzeżenie: (0%)
-----


Możesz sobie sprawdzić co tam masz w liczbie
  1. preg_match('/content=\"(.+)\swynik/', $file, $matchesResults);
  2. $cut = str_split($matchesResults[1],1);
  3. foreach($cut as $c){
  4. echo $c.' : '.dechex(ord($c)).'<br />';
  5. }

Wypisuje kolejne znaki z liczby i wartość hex, jeśli trzecia wartość 20 to jest spacja.
Więcej pomysłów nie mam.
Go to the top of the page
+Quote Post
qdlaty88
post
Post #15





Grupa: Zarejestrowani
Postów: 21
Pomógł: 2
Dołączył: 11.09.2013

Ostrzeżenie: (0%)
-----


  1. preg_match('/content=\"(.+)\swyników/', $file, $matchesResults);
  2. //print_r($matchesResults);
  3. $cut = str_split($matchesResults[1],1);
  4. foreach($cut as $c){
  5. echo $c.' : '.dechex(ord($c)).'<br />';
  6. }

Daje:
  1. 1 : 31
  2. 1 : 31
  3. &#65533; : c2 // Tu na wydruku jest pytajnik w czarnym rombie.
  4. &#65533; : a0 // Tu też.
  5. 2 : 32
  6. 4 : 34
  7. 8 : 38


Zrobię to tak jak pisałem wcześniej - wyszukując osobno obie części ciągu i później je łącząc.

Cytat(_Borys_ @ 12.09.2013, 14:11:29 ) *
Możesz sobie sprawdzić co tam masz w liczbie
  1. preg_match('/content=\"(.+)\swynik/', $file, $matchesResults);
  2. $cut = str_split($matchesResults[1],1);
  3. foreach($cut as $c){
  4. echo $c.' : '.dechex(ord($c)).'<br />';
  5. }

Wypisuje kolejne znaki z liczby i wartość hex, jeśli trzecia wartość 20 to jest spacja.
Więcej pomysłów nie mam.


To wystarczy (IMG:style_emoticons/default/smile.gif)
Swoim postem podsunąłeś mi rozwiązanie (IMG:style_emoticons/default/smile.gif)
Skoro tam są dwa jakieś znaki to wystarczy zrobić tak:
  1. $patternResults = '/content=\"(\d+.+)+wyników/';
  2. preg_match($patternResults, $file, $matchesResults);
  3. echo '<br />'.(int)preg_replace('#[^0-9.]#', '', $matchesResults[1]);


i mam to co mnie interesuje (IMG:style_emoticons/default/smile.gif)
Dzięki za pomoc (IMG:style_emoticons/default/biggrin.gif)

Ten post edytował qdlaty88 12.09.2013, 13:37:03
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 6.10.2025 - 16:08