Как получить из DOM массив элементов ID? (Парсер сайта)

131
02 июня 2019, 20:10

Существует сайт, каталог. В каталоге есть множество элементов. Ссылка на каждый элемент имеет вид exemple.com/anket/50850. Нужно получить 50850.

На одной странице множество ссылок следующего вида:

<a href="/anket/75882?log=1&pos=1&page=1&pagepos=1&pageid=0&city=1" data-href="/anket/75882?log=1&pos=1&page=1&pagepos=1&pageid=0&city=1" onmousedown="this.setAttribute('href', this.getAttribute('data-href'))" class="item"> Код элемента каталога </a>

Получил страницу следующим кодом:

$ch = curl_init();
for ($i=0; $i < 3; $i++) { 
   curl_setopt($ch, CURLOPT_URL, "https://exemple.com");
   curl_setopt($ch, CURLOPT_HEADER, 0);
   curl_exec($ch);
}
curl_close($ch);

DOM храниться в $ch. В нем же и каталог. Вытянуть ID пробовал с помощью регулярного выражения (регулярное выражение сформировал с помощью сервиса txt2re.com).

Для формирования кода получения необходимого ID, сначала добавил туда только 1 тег a, потом попробовал туда добавить 2-ой тег, после этого код вырос и получилось вот что:

$txt='<a href="/anket/50850?log=1&amp;pos=2&amp;page=1&amp;pagepos=2&amp;pageid=0&amp;city=1" data-href="/anket/50850?log=1&amp;pos=2&amp;page=1&amp;pagepos=2&amp;pageid=0&amp;city=1" onmousedown="this.setAttribute(\'href\', this.getAttribute(\'data-href\'))" class="item"> <a href="/anket/75882?log=1&amp;pos=1&amp;page=1&amp;pagepos=1&amp;pageid=0&amp;city=1" data-href="/anket/75882?log=1&amp;pos=1&amp;page=1&amp;pagepos=1&amp;pageid=0&amp;city=1" onmousedown="this.setAttribute(\'href\', this.getAttribute(\'data-href\'))" class="item">';
  $re1='.*?';   # Non-greedy match on filler
  $re2='(\\d+)';    # Integer Number 1
  $re3='.*?';   # Non-greedy match on filler
  $re4='\\d+';  # Uninteresting: int
  $re5='.*?';   # Non-greedy match on filler
  $re6='\\d+';  # Uninteresting: int
  $re7='.*?';   # Non-greedy match on filler
  $re8='\\d+';  # Uninteresting: int
  $re9='.*?';   # Non-greedy match on filler
  $re10='\\d+'; # Uninteresting: int
  $re11='.*?';  # Non-greedy match on filler
  $re12='\\d+'; # Uninteresting: int
  $re13='.*?';  # Non-greedy match on filler
  $re14='\\d+'; # Uninteresting: int
  $re15='.*?';  # Non-greedy match on filler
  $re16='\\d+'; # Uninteresting: int
  $re17='.*?';  # Non-greedy match on filler
  $re18='\\d+'; # Uninteresting: int
  $re19='.*?';  # Non-greedy match on filler
  $re20='\\d+'; # Uninteresting: int
  $re21='.*?';  # Non-greedy match on filler
  $re22='\\d+'; # Uninteresting: int
  $re23='.*?';  # Non-greedy match on filler
  $re24='\\d+'; # Uninteresting: int
  $re25='.*?';  # Non-greedy match on filler
  $re26='\\d+'; # Uninteresting: int
  $re27='.*?';  # Non-greedy match on filler
  $re28='\\d+'; # Uninteresting: int
  $re29='.*?';  # Non-greedy match on filler
  $re30='(\\d+)';   # Integer Number 2
  if ($c=preg_match_all ("/".$re1.$re2.$re3.$re4.$re5.$re6.$re7.$re8.$re9.$re10.$re11.$re12.$re13.$re14.$re15.$re16.$re17.$re18.$re19.$re20.$re21.$re22.$re23.$re24.$re25.$re26.$re27.$re28.$re29.$re30."/is", $txt, $matches))
  {
      $int1=$matches[1][0];
      $int2=$matches[2][0];
      print "($int1) ($int2) \n";
  }

При этом, если увеличивать количество тегов а, то он и размер кода увеличивает. Что-то вариант совсем непригодный для выполнения моей задачи.

ВОПРОС

Как лучше получить список ID со страницы?

P.S. Вариант с регулярным выражением <a href="/anket/(\d+) в reg_match_all() у меня выдает ошибку.

Код:

preg_match_all ('<a href="/anket/(\d+)', $txt, $matches, PREG_PATTERN_ORDER);
    print_r($matches);

Ошибка:

P.S.S.

Испробовал следующий код:

preg_match_all('#<a href="/anket/(\d+)#is', $txt, $matches, PREG_PATTERN_ORDER); 
print_r($matches); 

Если в переменной $txt передать документ полученный с помощью Curl, то получаю ошибку:

Warning: preg_match_all() expects parameter 2 to be string, resource given in E:\OSPanel\domains\localhost\index.php on line 34

READ ALSO
функция не видит переменную php

функция не видит переменную php

echo functionname(array("first"=>12,"sec"=>45,"third"=>23,"forth"=>55));

142
Как получить info hash из торрента на php

Как получить info hash из торрента на php

Как получить info hash из торрент файла? Какие данные нужно хешировать? В каком порядке?

158
ZF3: Как настроить EventManager событие MvcEvent::EVENT_RENDER для отработки только в одном Модуле?

ZF3: Как настроить EventManager событие MvcEvent::EVENT_RENDER для отработки только в одном Модуле?

Есть два модуля: Application и Blog, в каждом из них есть файл Modulephp со своей логикой

156