Я пытаюсь очистить некоторые конкретные данные и вывести их на свой сайт.
Я использую 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];
ive попытался сделать регулярное выражение только тегом "a ...", но я получил много результатов, я просто хочу получить капитал.
Вы пробовали использовать PHP Xpaths?
Вы должны были опубликовать код для получения содержимого URL, что является причиной этой ошибки.
@dGRAMOP нет, но я не могу проверить их прямо сейчас.
@AbraCadaver Я понял, что с регулярным выражением я не могу анализировать теги html и т.д. Но есть ли какое-либо решение в примере с регулярным выражением?






Вместо этого не анализируйте 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 мегабайтами по умолчанию.