palex/phpstructureddata

此包已弃用且不再维护。未建议替代包。

一组PHP库,使用http://schema.org词汇表来实现和输出Microdata或RDFa Lite 1.1语义。

v2.0.1 2015-03-02 23:08 UTC

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期间创建。

快速概述

该库的设计目标是

  1. 能够切换到Microdata和RDFa Lite 1.1语义。
  2. 能够动态切换类型,只需更改类型(有超过550+种不同的类型)。
  3. 显示验证后的语义,库负责以正确的格式显示数据(例如,所有日期都按照ISO标准)。
  4. 启用/禁用库输出。
  5. 后备,您永远不会丢失任何有意义的语义(例如,如果您更改类型且它没有作者属性,它将回退到具有名称属性的Person类型)。

类图

Class Diagram

安装

  • 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

ParserPlugin Syntax
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>
指定通用项目属性

ParserPlugin Syntax
一旦声明了模式,下一步是声明单个属性——解释内容和赋予其语义意义。

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>
指定模式相关的项目属性

ParserPlugin Syntax
有时您可能需要明确声明一个属性,该属性仅在特定模式活动时使用——例如,如果属性在一个模式中有一个特定的属性,而在另一个模式中则不同。

可以通过使用结合 Typeproperty 的组合来实现这一点,它们之间用句点分隔。简而言之,如果当前全局作用域等于 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>

使用多个属性

ParserPlugin Syntax
通过结合这些方法,可以指定多个属性,包括一些特定于模式以及一些通用的属性。构建块的顺序并不重要,空白用作分隔符。

示例
<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>
算法
  1. 首先解析器检查 setTypes。如果找到一个或多个匹配项,则当前全局作用域将更新为第一个匹配项。此时,如果没有特定或通用属性,则算法将结束,并用指定作用域替换数据标签。否则继续第2点。
  2. 解析器检查 特定项目属性。如果找到一个或多个有效匹配项,则算法将结束,并用第一个匹配属性替换数据标签。否则转到第3点。
  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 文件以获取详细信息。