据我所知,Facebook 从meta name="description"
链接页面上标签的内容属性中提取。
如果没有可用的元描述标签,它似乎从<p>
它可以在页面上找到的第一个段落标签的开头拉出。
图片是从<img>
页面上的可用标签中提取的,在发布时可以选择轮播。
最后,链接子文本也是用户可编辑的(启动状态更新,包含链接,然后单击出现的链接子文本区域)。
就我个人而言,我会采用这样的路线:卷曲页面,解析它以获得元标记描述,如果没有使用基本算法或仅第一段标记获取一些可能的数据,然后允许用户编辑呈现的任何内容(它更友好给用户,还解决了用户代理不同回报的问题)。将面向用户的控件设置为 ajax,这样您的站点访问要预览的链接所花费的时间都不会出现问题。
我建议使用 DOM 库(如果您对它感到满意并且知道如何处理可能格式错误的 html 页面,您甚至可以使用 DOMDocument)而不是正则表达式来解析页面的<meta>
,<p>
和可能还有<img>
标签。构建一个正则表达式可以正确处理您将在“野外”遇到的所有潜在不同情况,而不是从一组已知站点中遇到的情况可能会变得非常粗糙。通常推荐使用QueryPath,并且有涵盖许多可用选项的 stackoverflow 线程。
大多数现代网站,尤其是大型网站,都擅长填充元描述标签,尤其是对于动态生成的页面。
您也可以从页面上抓取<img>
标签,但您需要在本地托管图像:您可以托管所有图像,然后删除除所选图像之外的所有图像,或者您可以托管缩略图(假设您有一个图像处理库安装并打开)。您选择哪一个取决于带宽和存储是否更重要,或者运行imagecopyresampled
、imagecopyresized
、Gmagick::thumbnailimage
等的一次性处理等(选择您手头/您最喜欢的任何东西)。您不希望热链接到页面上的图像,因为它在带宽方面的道德性,特别是在链接任何具有防热链接的站点(引荐来源/等方法)时最终出现损坏图像的可能性,或者从到期/等 就个人而言,我可能会去存储缩略图。
如果您想最终删除自己服务器上的图像/缩略图文件,您可以将整个链接实体包装为处理过期/等的对象。既然你要求一个高层次的想法,我会把具体的实现留给你。
但问题是,在很多情况下,facebook 返回的文本在页面上不可用。
您是否查看过页面的元标记?到目前为止,我已经测试了几个页面,这通常是在呈现的链接页面上不可见的内容的来源,并且似乎是 Facebook 算法的首选。