首页 > 解决方案 > 正则表达式选择特定的 html 元素 [Curl / PHP]

问题描述

我正在尝试抓取一些特定数据并将它们输出到我的站点中。

我想提取什么-

我在 PHP 中使用 Curl,这是我尝试使用的正则表达式,但它给了我一个错误致命错误:允许的 ram 字节的内存大小耗尽,这意味着它需要很多文件。

代码:

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 ...”标签,但我得到了很多结果,我只想抓住资本。

标签: phphtmlregexcurl

解决方案


不要使用正则表达式解析 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 GB,高于默认的 128 MB。


推荐阅读