palex / phpstructureddata
一组PHP库,使用http://schema.org词汇表来实现和输出Microdata或RDFa Lite 1.1语义。
Requires
- php: >=5.3.0
Requires (Dev)
This package is not auto-updated.
Last update: 2024-02-17 13:34:17 UTC
README
一组PHP库,使用http://schema.org词汇表来实现和输出Microdata或RDFa Lite 1.1语义。
此库自3.2版Joomla CMS以来被使用(称为JMicrodata)。
在2013年和2014年的Google Summer of Code期间创建。
快速概述
该库的设计目标是
- 能够切换到Microdata和RDFa Lite 1.1语义。
- 能够动态切换类型,只需更改类型(有超过550+种不同的类型)。
- 显示验证后的语义,库负责以正确的格式显示数据(例如,所有日期都按照ISO标准)。
- 启用/禁用库输出。
- 后备,您永远不会丢失任何有意义的语义(例如,如果您更改类型且它没有作者属性,它将回退到具有名称属性的Person类型)。
类图
安装
-
Composer:
在您的composer.json文件中添加{ "require": { "palex/phpstructureddata": "*" } } -
从源:
运行git clone https://github.com/alexprut/PHPStructuredData.git -
直接下载:
从这里下载最新版本
使用示例
假设您已经有一个Microdata或RDFa库的实例。您需要向以下HTML添加Microdata或RDFa语义,这是文章的一部分(例如, $sd = new PHPStructuredData\Microdata('Article');)。
<div <?php echo $sd->displayScope();?>> <!-- Language --> <?php echo $sd->content(null, 'en-GB')->property('inLanguage')->display('meta', true)?> <!-- Title --> <?php echo $sd->content('How to Tie a Reef Knot')->property('name')->display();?> <!-- Author--> <span> Written by <?php echo $sd->content('John Doe')->property('author')->fallback('Person', 'name')->display();?> </span> <!-- Date published --> <?php echo $sd->content('1 January 2014', '2014-01-01T00:00:00+00:00')->property('datePublished')->display();?> <!-- Content --> <?php echo $sd->content('Lorem ipsum dolor sit amet...')->property('articleBody')->display();?> <div>
Microdata库将渲染
<div itemscope itemtype='https://schema.org/Article'> <!-- Language --> <meta itemprop='inLanguage' content='en-GB'/> <!-- Title --> <span itemprop='name'> How to Tie a Reef Knot </span> <!-- Author --> <span> Written by <span itemprop='author' itemscope itemtype='https://schema.org/Person'> <span itemprop='name'>John Doe</span> </span> </span> <!-- Date published --> <meta itemprop='datePublished' content='2014-01-01T00:00:00+00:00'/>1 January 2014 <!-- Content --> <span itemprop='articleBody'> Lorem ipsum dolor sit amet... </span> <div>
RDFa库将渲染
<div vocab='https://schema.org' typeof='Article'> <!-- Language --> <meta property='inLanguage' content='en-GB'/> <!-- Title --> <span property='name'> How to Tie a Reef Knot </span> <!-- Author --> <span> Written by <span property='author' vocab='https://schema.org' typeof='Person'> <span property='name'>John Doe</span> </span> </span> <!-- Date published --> <meta property='datePublished' content='2014-01-01T00:00:00+00:00'/>1 January 2014 <!-- Content --> <span property='articleBody'> Lorem ipsum dolor sit amet... </span> <div>
相反,如果您决定更改当前类型(例如, $sd->setType('Review');)。
Microdata库将渲染
<div itemscope itemtype='https://schema.org/Review'> <!-- Language --> <meta itemprop='inLanguage' content='en-GB'/> <!-- Title --> <span itemprop='name'> How to Tie a Reef Knot </span> <!-- Author --> <span> Written by <span itemscope itemtype='https://schema.org/Person'> <span itemprop='name'>John Doe</span> </span> </span> <!-- Date published --> <meta itemprop='datePublished' content='2014-01-01T00:00:00+00:00'/>1 January 2014 <!-- Content --> Lorem ipsum dolor sit amet... <div>
RDFa库将渲染
<div vocab='https://schema.org' typeof='Review'> <!-- Language --> <meta property='inLanguage' content='en-GB'/> <!-- Title --> <span property='name'> How to Tie a Reef Knot </span> <!-- Author --> <span> Written by <span vocab='https://schema.org' typeof='Person'> <span property='name'>John Doe</span> </span> </span> <!-- Date published --> <meta property='datePublished' content='2014-01-01T00:00:00+00:00'/>1 January 2014 <!-- Content --> Lorem ipsum dolor sit amet... <div>
如你所见,John Doe 回退到Person类型,并且没有信息丢失,即使当前类型没有作者属性,它也会显示对机器重要的信息,搜索引擎知道有一个Person John Doe。
相反,如果您决定不渲染Microdata或RDFa语义,只需禁用库输出(例如, $sd->enable('false');)。
Microdata和RDFa库都将渲染
<div > <!-- Language --> <!-- Title --> How to Tie a Reef Knot <!-- Author--> <span> Written by John Doe </span> <!-- Date published --> 1 January 2014 <!-- Content --> Lorem ipsum dolor sit amet... <div>
目前,RDFa和Microdata库都不支持多重后备。
ParserPlugin
如果您想将视图与逻辑分离,ParserPlugin是一个用于解析HTML标记并将HTML5的data-*属性转换为正确格式的Microdata或RDFa Lite 1.1语义的PHP类。
HTML5 中的 data-* 属性是新的,它们使我们能够在所有 HTML 元素上嵌入自定义数据属性。因此,如果您禁用了库输出,HTML 仍然可以通过验证。库默认会搜索的后缀是 data-sd,其中 sd 代表结构化数据,但您可以注册多个自定义后缀。
标记语法
setType
type 定义了以下标记所使用的模式。类型必须始终以大写字母开头才能正确解释。如果类型是有效的模式,则从该点开始更新页面的全局作用域为此模式。插件将在 Microdata 语义的情况下将数据标签替换为 itemscope itemtype='https://schema.org/Type',或者在 RDFa Lite 1.1 语义的情况下替换为 vocab='https://schema.org' typeof='Type'。
示例
<div data-sd="Article"> <p>This is my article</p> </div>
这将使用 Microdata 语义输出
<div itemscope itemtype="http://schema.org/Article"> <p>This is my article</p> </div>
或者使用 RDFa 语义输出
<div vocab="http://schema.org" typeof="Article"> <p>This is my article</p> </div>
指定通用项目属性
一旦声明了模式,下一步是声明单个属性——解释内容和赋予其语义意义。
property 必须始终以小写字母开头才能正确解释。如果属性被找到是当前模式的一部分,插件将在 Microdata 语义的情况下将数据标签替换为 itemprop='property',或者在 RDFa Lite 1.1 语义的情况下替换为 property='property'。如果属性不是有效模式的有效属性,它将被忽略,并解析下一个可用的属性。
示例
<div data-sd="Article"> <p data-sd="articleBody">This is my article</p> </div>
这将使用 Microdata 语义输出
<div itemscope itemtype="http://schema.org/Article"> <p itemprop="articleBody">This is my article</p> </div>
或者使用 RDFa 语义输出
<div vocab="http://schema.org" typeof="Article"> <p property="articleBody">This is my article</p> </div>
指定模式相关的项目属性
有时您可能需要明确声明一个属性,该属性仅在特定模式活动时使用——例如,如果属性在一个模式中有一个特定的属性,而在另一个模式中则不同。
可以通过使用结合 Type 和 property 的组合来实现这一点,它们之间用句点分隔。简而言之,如果当前全局作用域等于 Type,并且属性是那个 Type 的一部分,则插件将在 Microdata 语义的情况下将数据标签替换为 itemprop='property',或者在 RDFa Lite 1.1 语义的情况下替换为 property='property'。
示例
<div data-sd="Article"> <p data-sd="articleBody">This is my article</p> <p data-sd="Article.wordcount">4</p> </div>
这将使用 Microdata 语义输出
<div itemscope itemtype="http://schema.org/Article"> <p itemprop="articleBody">This is my article</p> <p itemprop="wordcount">4</p> </div>
或者使用 RDFa 语义输出
<div vocab="http://schema.org" typeof="Article"> <p property="articleBody">This is my article</p> <p property="wordcount">4</p> </div>
使用多个属性
通过结合这些方法,可以指定多个属性,包括一些特定于模式以及一些通用的属性。构建块的顺序并不重要,空白用作分隔符。
示例
<div data-sd="Article"> <p data-sd="articleBody">This is my article</p> <p data-sd="Article.wordcount">4</p> <p data-sd="Recipe.recipeCategory Article.articleSection description">Amazing dessert recipes</p> </div>
这将使用 Microdata 语义输出
<div itemscope itemtype="http://schema.org/Article"> <p itemprop="articleBody">This is my article</p> <p itemprop="wordcount">4</p> <p itemprop="articleSection">Amazing dessert recipes</p> </div>
或者使用 RDFa 语义输出
<div vocab="http://schema.org" typeof="Article"> <p property="articleBody">This is my article</p> <p property="wordcount">4</p> <p property="articleSection">Amazing dessert recipes</p> </div>
嵌套模式
有时需要嵌套模式 - 例如,当您打开 Article 模式时,想描述一个人。这可以通过嵌套模式实现。要使用它,只需在属性后,用句点加模式名称,即可。使用完嵌套模式后,关闭包含标签,并重置原始模式。
示例
<div data-sd="Article"> <p data-sd="articleBody">This is my article</p> <p data-sd="Article.wordcount">4</p> <div data-sd="author.Person"> <p data-sd="Person name">John Doe</p> </div> <p data-sd="Article keywords">Cake</p> </div>
这将使用 Microdata 语义输出
<div itemscope itemtype="http://schema.org/Article"> <p itemprop="articleBody">This is my article</p> <p itemprop="wordcount">4</p> <div itemprop="author" itemscope itemtype="http://schema.org/Person"> <p itemprop="name">John Doe</p> </div> <p itemprop="keywords">Cake</p> </div>
或者使用 RDFa 语义输出
<div vocab="http://schema.org" typeof="Article"> <p property="articleBody">This is my article</p> <p property="wordcount">4</p> <div property="author" vocab="http://schema.org" typeof="Person"> <p property="name">John Doe</p> </div> <p itemprop="keywords">Cake"</p> </div>
算法
- 首先解析器检查 setTypes。如果找到一个或多个匹配项,则当前全局作用域将更新为第一个匹配项。此时,如果没有特定或通用属性,则算法将结束,并用指定作用域替换数据标签。否则继续第2点。
- 解析器检查 特定项目属性。如果找到一个或多个有效匹配项,则算法将结束,并用第一个匹配属性替换数据标签。否则转到第3点。
- 解析器检查 通用属性。如果找到一个或多个有效匹配项,则算法将用第一个匹配的属性替换数据标签,并完成算法。
使用示例
假设您已经有一个 ParserPlugin 库的实例。您需要向以下 HTML 添加 Microdata 或 RDFa 语义,该 HTML 是文章的一部分(例如:$parser = new PHPStructuredData\ParserPlugin('microdata'); $scope='Article';)。
<div data-sd="<?php echo $scope;?>"> <!-- Title --> <span data-sd="Review.itemReviewed name"> How to Tie a Reef Knot </span> <!-- Author --> <span> Written by <span data-sd="author.Person"> <span data-sd="name">John Doe</span> </span> </span> <!-- Date published --> <meta data-sd='<?php echo $scope;?> datePublished' content='2014-01-01T00:00:00+00:00'/>1 January 2014 <!-- Content --> <span data-sd='reviewBody articleBody'> Lorem ipsum dolor sit amet... </span> <div>
Microdata 输出将是:
<div itemscope itemtype='https://schema.org/Article'> <!-- Title --> <span itemprop='name'> How to Tie a Reef Knot </span> <!-- Author --> <span> Written by <span itemprop='author' itemscope itemtype='https://schema.org/Person'> <span itemprop='name'>John Doe</span> </span> </span> <!-- Date published --> <meta itemprop='datePublished' content='2014-01-01T00:00:00+00:00'/>1 January 2014 <!-- Content --> <span itemprop='articleBody'> Lorem ipsum dolor sit amet... </span> <div>
RDFa 输出将是:
<div vocab='https://schema.org' typeof='Article'> <!-- Title --> <span property='name'> How to Tie a Reef Knot </span> <!-- Author --> <span> Written by <span property='author' vocab='https://schema.org' typeof='Person'> <span property='name'>John Doe</span> </span> </span> <!-- Date published --> <meta property='datePublished' content='2014-01-01T00:00:00+00:00'/>1 January 2014 <!-- Content --> <span property='articleBody'> Lorem ipsum dolor sit amet... </span> <div>
相反,如果您决定更改当前类型(例如:$scope="Review";)。Microdata 输出将是:
<div itemscope itemtype='https://schema.org/Review'> <!-- Title --> <span itemprop='itemReviewed'> How to Tie a Reef Knot </span> <!-- Author --> <span> Written by <span itemprop='author' itemscope itemtype='https://schema.org/Person'> <span itemprop='name'>John Doe</span> </span> </span> <!-- Date published --> <meta itemprop='datePublished' content='2014-01-01T00:00:00+00:00'/>1 January 2014 <!-- Content --> <span itemprop='reviewBody'> Lorem ipsum dolor sit amet... </span> <div>
RDFa 输出将是:
<div vocab='https://schema.org' typeof='Review'> <!-- Title --> <span property='itemReviewed'> How to Tie a Reef Knot </span> <!-- Author --> <span> Written by <span property='author' vocab='https://schema.org' typeof='Person'> <span property='name'>John Doe</span> </span> </span> <!-- Date published --> <meta property='datePublished' content='2014-01-01T00:00:00+00:00'/>1 January 2014 <!-- Content --> <span property='reviewBody'> Lorem ipsum dolor sit amet... </span> <div>
文档
PHPStructuredData 库使用 types.json 文件来检查和输出经过验证的语义,该文件包含来自 http://schema.org 词汇表的所有可用类型和属性,并由 https://github.com/alexprut/Spider4Schema 网络爬虫自动生成。
待办事项
结构化数据
- 添加
itemref支持。 - 添加对
StructuredData的多个回退支持。 - 将 Google、Yandex 和 Baidu 规定的所有必需属性添加到
types.json中。
许可证
PHPStructuredData 在 MIT 许可证下授权 - 请参阅 LICENSE 文件以获取详细信息。