PHP正则表达式获取数据ID属性

时间:2021-07-12 11:22:46

标签: php html

我有这个链接:Alchemilla vulgaris。 这是关于某种草药的图片的谷歌图片链接,我想在此网页的代码中搜索具有属性 <div>data-id 标签,并使用 {{1} 提取 data id }.

我有这个代码,但它没有显示任何结果。我认为问题在于正则表达式。你能帮我把它弄好吗。

preg_match_all

谢谢

1 个答案:

答案 0 :(得分:1)

如果您还没有看过这个https://stackoverflow.com/a/1732454/4907162

是的,正如评论中指出的那样,真正的 DOM/XML parser 会更合适。也有 regex has a time and place for its usage ... HTML parsing with regex really isn't the best thing 但当然可以做一些事情。

需要注意的几点:

Google 不喜欢机器人抓取它 - 如果您看起来像机器人,您甚至可能会被要求解决 (re-)?captcha。所以此时(未来可能会改变?)如果您的User-Agent与已知的“友好”不匹配,则UA你被过滤掉并得到一个不同的 HTML 结果。我敢肯定,您可能已经执行了 echo $html; 只是为了看到您正在获取内容,但是如果您手动搜索,您将看到生成的数据包含您的 data-id 字符串正在努力寻找。

因此,对于您使用 PHP 函数 file_get_contents 的情况,您需要执行以下操作:

$opts = array('http' =>
  array(
    'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.67'
  )
);

$context  = stream_context_create($opts);

$html = file_get_contents( $url, false, $context );

对于正则表达式,这是一个小改动:

preg_match_all('#<div\s[^>]*?(?:data-id=[\'"](.*?)[\'"]).*?>#is',$html, $matches );

当我试图简单地让脚本工作时,如果您想以另一种方式查看,我最终创建了这个正则表达式。

preg_match_all('#<div\s+[^>]+data-id=[\'"]([^\'"]+)[\'"][^>]*>#is', $html, $matches )

Tim Toady 碳酸氢盐


以我能找到的方式回答您的评论 - 也许其他人可以详细说明:

在 PHP 中,提供给 file_get_contents 的上下文允许添加附加信息以从 HTTP/URL 调用信息。

如果您要在您拥有的服务器的 URL 上测试 file_get_contents,您可能会注意到日志中的 User-Agent 为空。至少在我使用的服务器上,用户代理是一个空字符串。 context 允许指定传递给您尝试从中提取数据的服务器的用户代理。

您从中提取数据的服务器处理其余信息。在从 Google 呼叫信息的情况下 - 他们会检查用户代理信息。您会想要使用“已知友好”(我称之为)用户代理。

流的上下文允许提供服务器希望看到的信息。或者至少这就是我可以在文件/url资源的上下文中为 PHP 描述的内容阅读.

我希望这会有所帮助。我承认我不知道如何回复更有用的信息。