Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] preg_match_all i problem z operatorami logicznymi
Forum PHP.pl > Forum > Przedszkole
blokern
Cześć, pobieram zawartość strony https://www.youtube.com/user/SPInkafilmstudio/featured a następnie staram się wyciągnąć liczbe subskrybcji kanału która jest w tym tagu:

  1. <yt-formatted-string id="subscriber-count" class="style-scope ytd-c4-tabbed-header-renderer">1,94&nbsp;mln subskrypcji</yt-formatted-string>



robie to w ten sposób:

  1. $youtube = file_get_contents('https://www.youtube.com/user/SPInkafilmstudio/featured');
  2. preg_match_all("!<yt-formatted-string id=\"subscriber-count\" [^>]+>(.*?)</yt-formatted-string>!", $youtube, $matches);
  3. print_r($matches);


ale zwrca mi puste tablice. gdzie zrobilem błąd?

z góry dziękuję za odpowiedź
viking
<\/yt-formatted-string>
blokern
  1. preg_match_all("!<yt-formatted-string id=\"subscriber-count\" [^>]+>(.*?)<\/yt-formatted-string>!", $youtube, $matches);


nadal zawraca: Array ( [0] => Array ( ) [1] => Array ( ) )
viking
https://regex101.com/r/3JzAq7/1
viking
file_get_contents() has been disabled for security reasons

Porównałeś flagi do regexpa?
blokern
<b>Warning</b>: file_get_contents() has been disabled for security reasons in <b>[...][...]</b> on line <b>2</b><br />

to wyskakuje dla strony http://sandbox.onlinephpfunctions.com/,

file_get_contents() dla strony https://www.youtube.com/channel/UCrGT7PPCkL5qeOyqU91Mx_w dziala np w przypadku wyciagania <span>


np.:

  1. $youtube = file_get_contents('https://www.youtube.com/user/SPInkafilmstudio/featured');
  2. echo $youtube;


dziala
kreatiff
Przy pobieraniu kodu za pomocą file_get_contents masz inny kod wynikowy strony, niż gdy przy wchodzeniu przez przeglądarkę. Dlatego preg_replace_all nie znajduje niczego, bo w tym kodzie nie ma w ogóle tagu <yt-formatted-string...>.
Zamiast tego, liczba subskrypcji podana jest w zwykłym tagu <span> już nawet bez id i trzeba się nieco więcej nagimnastykować by to wyłuskać.
blokern
Dzięki za naprowadzenie

  1. preg_match_all("!<span class=\"yt-subscription-button-subscriber-count-branded-horizontal subscribed yt-uix-tooltip\"(.*?)>(.*?)</span>!", $youtube, $matches);
  2. echo $suby = str_replace("tys.","",(strip_tags($matches[0][0])));


i wyrzuca mi np.: 102&nbsp;

niestety nie moge pozbyc sie tej twardej spacji

probowalem: str_replace, trim, ' ', " ", '&nbsp;' nawet robilem str_replace i nic

jakies rady? moglbym np policzyc ile znakow jest w stringu a potem wyswietlic pierwszych wszystkie - 1 ale to mocne przegiecie.
trueblue
Kod
<yt-formatted-string id=\"subscriber-count\" [^>]+>([\d,]+).*?<\/yt-formatted-string>


Nie interesuje Cię "mln"?
blokern
probowalem wszystkiego co znam lub znalazlem w necie wlacznie ze zmianami w kodowanie plikow z utf na ansi i nic
jak moge pozbyc sie tej spacji?
trueblue
Podałem Ci wyrażenie na wyciągnięcie samej liczby.
Interesuje Cię postfix "mln", czy nie?
kreatiff
Masz bardziej elastycznego gotowca z DOMDocument i XPath:
  1. $dom = new DOMDocument;
  2. $html = file_get_contents('https://www.youtube.com/user/SPInkafilmstudio/featured');
  3. @ $dom->loadHTML('<?xml encoding="utf-8" ?>' . $html);
  4. // file_put_contents('yt.html', $dom->saveHTML()); // do testów, jaki kod zwraca YT
  5. $xpath = new DOMXPath($dom);
  6. $s = $xpath->query('//span[contains(@class, "yt-subscription-button-subscriber-count-branded-horizontal")]')->item(0);
  7. echo str_replace('&nbsp;', ' ', $s->nodeValue);
By się pozbyć twardej spacji użyj tego co w ostatniej linii. A jak nie chcesz tych mln czy co tam się jeszcze trafia, to utnij wszystko od "&".
YT zdarza się zmieniać kod, więc sprawdzaj go czy działa co kilka miesięcy, bo może się okazać, że pozmieniali np. kolejność klas i wówczas rozwiązanie oparte o wyrażania regularne jest mniej odporne na takie działania jak to co wyżej.
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.