регулярное выражение для выбора определенных элементов HTML [Curl / PHP] - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь очистить некоторые конкретные данные и вывести их на свой сайт.

what i want to extract-

Я использую Curl в PHP, и это регулярное выражение, которое я пытаюсь использовать, но оно дает мне ошибку. Неустранимая ошибка: допустимый объем памяти оперативной памятиисчерпаны байты, что означает, что требуется много файлов.

код:

preg_match_all('!<th scope="(\b[a-zA-Z]+\b)">(\b[a-zA-Z]+\b)<\/th><td><a href="\/wiki\/(\b[a-zA-Z]+\b)" title="(\b[a-zA-Z]+\b)">(\b[a-zA-Z]+\b)<\/a>!',$result,$cap_matches);
$cap_name = array_values(array_unique($cap_matches[0]));
echo $cap_name[0];

Я пытался сделать регулярное выражение только тегом "a ...", но я получил много результатов назад,я просто хочу захватить столицу.

1 Ответ

0 голосов
/ 22 мая 2018

не анализировать HTML с регулярным выражением. использовать вместо этого правильный синтаксический анализатор HTML, например DOMDocument.

$domd = @DOMDocument::loadHTML ( $result );
unset($result);
$xp = new DOMXPath ( $domd );
$capital = $xp->query ( '//th[text()="Capital"]/following-sibling::td/a' )->item ( 0 )->getAttribute("title");
unset($domd,$xp);
var_dump ( $capital );

, чтобы избежать ошибок OOM, попробуйте обернуть свои самые ресурсоемкие операции в меньшиефункции, позволяющие сборщику мусора очистить все при выходе из функции, или unset () ваши большие переменные как можно скорее, когда они больше не нужны ... (я бы не использовал unset () в приведенном выше коде, но так как вы специально жаловалисьоб ошибках OOM, я сделал).Другое очевидное решение заключается в увеличении лимита памяти, например,

if(false===ini_set("memory_limit","1G")){
    throw new \RuntimeException('error, unable to change memory limit!');
};

должен установить ограничение памяти на 1 гигабайт, по сравнению со 128 мегабайтами по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...