cse/dom-manager

一个用于管理DOM(XML,HTML)文档的简单库。

dev-master 2022-01-15 18:45 UTC

This package is auto-updated.

Last update: 2024-09-16 00:49:48 UTC


README

英语 | 俄语

DOM Manager

一个用于管理DOM(XML,HTML)文档的简单库。

项目仓库: https://github.com/cs-eliseev/dom-manager

DEMO

use cse\DOMManager\DomManager;
...
$content = file_get_contents('https://w3schools.org.cn/xml/simple.xml');
$easyLoader = new DomManager();
$node = $easyLoader->parse($content);
$name = $node->find('name')->first()->text(); // Belgian Waffles

安装

您可以在这里找到此项目的最新版本。

Composer

执行以下命令以获取该包的最新版本

composer require cse/dom-manager

或者composer.json文件应包含以下内容

{
    "require": {
        "cse/dom-manager": "*"
    }
}

Git

在本地上克隆此仓库

git clone https://github.com/cs-eliseev/dom-manager.git

下载

在此处下载最新版本.

用法

以下演示如何在PHP应用程序中使用此库的函数。

初始化

DomManager实例将数据转换为操作DOM树的结构。

转换XML结构

use cse\DOMManager\IDomManager;
...
$easyLoader = new IDomManager();
$nodes = $easyLoader->parse('<div><br/><br/></div>'); // Nodes entity

通过DOMDocument转换HTML结构

use cse\DOMManager\DomManager;
...
$domDocument = new DOMDocument('1.0', 'UTF-8');
$domDocument->loadHTML('<div><br><br></div>');
$easyLoader = new DomManager();
$nodes = $easyLoader->parse($domDocument); // Nodes entity

转换DOMNodeList

use cse\DOMManager\DomManager;
...
$domDocument = new DOMDocument('1.0', 'UTF-8');
$domDocument->loadXML('<div><br/><br/></div>');

$easyLoader = new DomManager();
$nodes = $easyLoader->parse($domDocument->getElementsByTagName('br')); // Nodes entity

转换DOMNode

use cse\DOMManager\DomManager;
...
$domDocument = new DOMDocument('1.0', 'UTF-8');
$domDocument->loadXML('<div><br/><br/></div>');

$easyLoader = new DomManager();
$nodes = $easyLoader->parse($domDocument->getElementsByTagName('br')->item(1)); // Nodes entity

Nodes实例表示一个DOMNode对象的列表,可以进行操作。

方法

示例

文档内容示例

<main class="main" role="main">
    <div class="content">
        <div>
            <h1><i class="icon"/><span>Header</span>-subheader</h1>
            <img src="content_img.jpg" alt="content img"/>
            <p><span class="text">First text</span></p>
        </div>
        <br/>
        <p>Last text</p>
    </div>
    <div class="description" role="contentinfo">
        <p>First description</p>
        <br/>
        <em>Middle description</em>
        <p><span>Last description</span></p>
    </div>
</main>

查找元素

返回所有找到的节点元素。

按标签名称搜索

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('div');

结果

<div class="content"><div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div><br/><p>Last text</p></div>
<div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div>
<div class="description" role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><span>Last description</span></p></div>

按XPath查找

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('//div/div');

结果

<div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div>

按属性查找

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('//*[@class="content"]');

结果

<div class="content"><div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div><br/><p>Last text</p></div>

第一个元素

返回第一个找到的节点元素。

列表中的第一个项目

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->first();

结果

<p><span class="text">First text</span></p>

节点中的第一个找到的元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->first('p');

结果

<p><span class="text">First text</span></p>

通过XPath在节点中找到的第一个元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->first('//span[@class]');

结果

<span class="text">First text</span>

节点中的第一个找到的元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('div')->first('p');

结果

<p><span class="text">First text</span></p>
<p><span class="text">First text</span></p>
<p>First description</p>

最后的元素

返回最后一个找到的节点元素。

列表中的最后一个项目

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->last();

结果

<p><span>Last description</span></p>

节点中的最后一个找到的元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->last('p');

结果

<p><span>Last description</span></p>

通过XPath在节点中找到的最后一个元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->last('//span[@class]');

结果

<span class="text">First text</span>

节点中的最后一个找到的元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('div')->last('p');

结果

<p>Last text</p>
<p><span class="text">First text</span></p>
<p><span>Last description</span></p>

第N个元素

按索引返回元素。

第N个列表项

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->getByPosition(1);

结果

<p>Last text</p>

节点中的第N个找到的元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->getByPosition(1, 'p');

结果

<p>Last text</p>

通过XPath在节点中找到的第N个元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->getByPosition(2, '//*[@class]');

结果

<i class="icon"/>

节点中的第N个找到的元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('div')->getByPosition(1, 'p');

结果

<p>Last text</p>
<p><span>Last description</span></p>

最接近的元素

返回最近的父元素。

按标签名称查找最接近的父元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('span')->closest('div');

结果

<div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div>
<div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div>
<div class="description" role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><span>Last description</span></p></div>

父元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('span')->closest();

结果

<h1><i class="icon"/><span>Header</span>-subheader</h1>
<p><span class="text">First text</span></p>
<p><span>Last description</span></p>

父元素

返回父元素。

父元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('span')->parent();

结果

<h1><i class="icon"/><span>Header</span>-subheader</h1>
<p><span class="text">First text</span></p>
<p><span>Last description</span></p>

根元素

返回根元素。

主要父元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('span')->root();

结果

<main class="main" role="main"><div class="content"><div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div><br/><p>Last text</p></div><div class="description" role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><span>Last description</span></p></div></main>

子元素

返回节点的所有子元素。

在节点中获取子元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->childes();

结果

<span class="text">First text</span>
<span>Last description</span>

在节点中查找子元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->childes('p');

结果

<span class="text">First text</span>
<span>Last description</span>

按XPath查找

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->childes('//*[@class="description"]/p');

结果

<span>Last description</span>

第一个子元素

返回节点的第一个子元素。

在节点中获取第一个子元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('div')->firstChild();

结果

<div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div>
<h1><i class="icon"/><span>Header</span>-subheader</h1>
<p>First description</p>

在节点中查找子元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->firstChild();

结果

<span class="text">First text</span>
<span>Last description</span>

在节点中查找子元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->firstChild('div');

结果

<span class="text">First text</span>
<span>Last description</span>

在节点中查找子元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->firstChild('p');

结果

<div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div>
<h1><i class="icon"/><span>Header</span>-subheader</h1>
<p>First description</p>

按XPath查找

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->firstChild('//div/div');

结果

<h1><i class="icon"/><span>Header</span>-subheader</h1>

获取DOMNode

按索引返回DOMNode元素。

按索引获取元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->getNodeByPosition(1);

结果

class DOMElement {}

查找DOMNode

按索引返回找到的DOMNode元素。

查找元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->findNodeByPosition(1, 'p');

结果

class DOMElement {}

节点名

返回节点名。

节点名

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('div')->name();

结果

div
div
div

重命名节点

重命名节点。

重命名当前节点

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('div')->rename('section');

结果

<section class="content"><section><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></section><br/><p>Last text</p></section>
<section><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></section>
<section class="description" role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><span>Last description</span></p></section>

查找并重命名节点

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->rename('section', 'div');
<div class="content"><div><h1><i class="icon"/><strong>Header</strong>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><strong class="text">First text</strong></p></div><br/><p>Last text</p></div>
<div><h1><i class="icon"/><strong>Header</strong>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><strong class="text">First text</strong></p></div>
<div class="description" role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><strong>Last description</strong></p></div>

替换节点

替换节点。

替换当前节点。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('div')->replace('<section><div>Header</div>Content</section>');
<main class="main" role="main"><section><div>Header</div>Content</section><section><div>Header</div>Content</section></main>

查找并替换节点。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->replace('<section><div>Header</div>Content</section>', 'div');

结果

<main class="main" role="main"><section><div>Header</div>Content</section><section><div>Header</div>Content</section></main>

通过XPath查找并替换节点。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->replace('<section><div>Header</div>Content</section>', '//div/div');

结果

<main class="main" role="main"><div class="content"><section><div>Header</div>Content</section><br/><p>Last text</p></div><div class="description" role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><span>Last description</span></p></div></main>

删除节点

删除节点。

删除当前节点。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('div')->remove();

结果

<main class="main" role="main"/>

查找并删除节点。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->remove('div');

结果

<main class="main" role="main"/>

通过XPath查找并删除节点。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->remove('//div/div');

结果

<main class="main" role="main"><div class="content"><br/><p>Last text</p></div><div class="description" role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><span>Last description</span></p></div></main>

计数

计算元素数量。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->count();     // 4
$nodes->count('p');             // 4
$nodes->count('//*[@class]');   // 5

元素存在

检查节点是否存在。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->exist();     // true
$nodes->exist('p');             // true
$nodes->exist('//*[@class]');   // true
$nodes->exist('hr');            // false

元素不存在

检查节点不存在。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->notExist();      // false
$nodes->notExist('p');              // false
$nodes->notExist('//*[@class]');    // false
$nodes->notExist('hr');             // true

是否为元素

检查元素数量是否为1。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('img')->isElem();  // true
$nodes->find('p')->isElem();    // false

是否为列表

检查元素数量是否超过1。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('img')->isList();  // false
$nodes->find('p')->isList();    // true

DomComment

验证DOMComment。使用isElem。默认情况下忽略节点DOMComment。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('img')->isDomComment();  // false
$nodes->find('p')->isDomComment();    // false

DomElement

验证DomElement。使用isElem。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('img')->isDomElement();        // true
$nodes->find('p')->isDomElement();          // false
$nodes->find('p')->first()->isDomElement(); // true

DomText

验证DomText。使用isElem。默认情况下忽略节点DomText。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('img')->isDomText();  // false
$nodes->find('p')->isDomText();    // false

节点类型

节点类型。默认情况下忽略节点类型非1。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('img')->type();  // 1
$nodes->find('p')->type();    // 1\n1\n1\n1

文本

返回文本。

获取当前项的文本

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('//h1/span')->text();              // Header
$nodes->find('h1')->text();                     // Header-subheader
$nodes->find('//*[@class="content"]')->text();  // Header-subheaderFirst textLast text

获取列表的文本

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->text();

结果

First text
Last text
First description
Last description

添加文本

将文本添加到节点的末尾。

添加文本到空元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('//h1/i')->addText('add text');

结果

<i class="icon">add text</i>

添加文本到元素的末尾

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('h1')->addText('add text');

结果

<h1><i class="icon"/><span>Header</span>-subheaderadd text</h1>

添加文本到列表

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->addText('add text');

结果

<p><span class="text">First text</span>add text</p>
<p>Last textadd text</p>
<p>First descriptionadd text</p>
<p><span>Last description</span>add text</p>

替换文本

在节点中替换文本。

添加文本到空元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('//h1/i')->replaceText('change text');

结果

<i class="icon">add text</i>

在节点中替换文本

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('h1')->replaceText('change text');

结果

<h1><i class="icon"/><span>Header</span>change text</h1>

替换列表中的文本

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->replaceText('change text');

结果

<p><span class="text">First text</span>change text</p>
<p>change text</p>
<p>change text</p>
<p><span>Last description</span>change text</p>

删除文本

在节点中删除文本。

在节点中删除文本

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('h1')->removeText();

结果

<h1><i class="icon"/><span>Header</span></h1>

删除列表中的文本

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->replaceText('change text');

结果

<p><span class="text">First text</span></p>
<p></p>
<p></p>
<p><span>Last description</span></p>

属性

返回属性值。

获取列表值

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('h1')->attr('class');

结果

content
description

获取值

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('h1')->attr('role');

结果

contentinfo

默认值

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('h1')->attr('role', 'default');

结果

default
default
contentinfo

是否有属性

检查属性是否存在。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('img')->hasAttr('src');        // true
$nodes->find('i')->hasAttr('class');        // true
$nodes->find('p')->hasAttr('class');        // false
$nodes->find('div')->hasAttr('class');      // false

设置属性

设置属性值。

设置元素的属性

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$elem = $nodes->find('i');
$elem->setAttr('class', 'value');               // <i class="value"/>
$elem->setAttr('data-value', 'edit');           // <i class="value" data-value="edit"/>
$elem->setAttr('class', 'icon value');          // <i class="icon value" data-value="edit"/>

设置列表的属性

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$elem = $nodes->find('p')->setAttr('class', 'text');

结果

<p class="text"><span class="text">First text</span></p>
<p class="text">Last text</p>
<p class="text">First description</p>
<p class="text"><span>Last description</span></p>

删除属性

删除属性。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$elem = $nodes->find('span')->removeAttr('class');

结果

<span>Header</span>
<span>First text</span>
<span>Last description</span>

添加子节点

添加子节点。

添加到空元素

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('i')->appendChild('<section><div>Header</div>Content</section>');

结果

<i class="icon"><section><div>Header</div>Content</section></i>

添加到列表

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->appendChild('<section><div>Header</div>Content</section>');

结果

<p><span class="text">First text</span><section><div>Header</div>Content</section></p>
<p>Last text<section><div>Header</div>Content</section></p>
<p>First description<section><div>Header</div>Content</section></p>
<p><span>Last description</span><section><div>Header</div>Content</section></p>

查找并添加

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->appendChild('<section><div>Header</div>Content</section>', 'p');

结果

<p><span class="text">First text</span><section><div>Header</div>Content</section></p>
<p>Last text<section><div>Header</div>Content</section></p>
<p>First description<section><div>Header</div>Content</section></p>
<p><span>Last description</span><section><div>Header</div>Content</section></p>

替换子节点

替换子节点。

替换所有子节点

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('h1')->replaceChildes('<section><div>Header</div>Content</section>');

结果

<h1><section><div>Header</div>Content</section><section><div>Header</div>Content</section>-subheader</h1>

通过节点名替换子节点

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('h1')->replaceChildes('<section><div>Header</div>Content</section>', 'i');

结果

<h1><section><div>Header</div>Content</section><span>Header</span>-subheader</h1>

删除子节点

删除子节点。

删除所有子节点

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('h1')->removeChildes();

结果

<h1>-subheader</h1>

通过节点名删除后代

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('h1')->removeChildes('i');

结果

<h1><span>Header</span>-subheader</h1>

DOMNode列表

返回DOMNode元素列表。

列表

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->toArray();

结果

[
    class DOMElement {},
    class DOMElement {},
    class DOMElement {},
    class DOMElement {}
]

NodeList

返回NodeList。

NodeList

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('p')->toList();

结果

class NodeList {}

内容

返回元素及其内容的标记。

获取当前元素的内容

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->find('h1')->toString();

结果

<h1><i class="icon"/><span>Header</span>-subheader</h1>

查找并获取元素的内容

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->toString('h1');

结果

<h1><i class="icon"/><span>Header</span>-subheader</h1>

通过XPath查找并获取元素的内容

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$nodes->toString('//div/p');

结果

<p><span class="text">First text</span></p>
<p>Last text</p>
<p>First description</p>
<p><span>Last description</span></p>a

遍历元素

对每个项目调用回调函数。

/** @var \cse\DOMManager\Nodes\Nodes $nodes */
$elem = $nodes->find('div');
$elem->each(function (\cse\DOMManager\Nodes\Nodes $item) {
    if ($item->hasAttr('class')) {
        $item->removeAttr('class');
    }
    $item->addText('this div element');
});
echo $elem->root()->content();

结果

<main class="main" role="main"><div><div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p>this div element</div><br/><p>Last text</p>this div element</div><div role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><span>Last description</span></p>this div element</div></main>

测试 & 代码覆盖率

PHPUnit用于单元测试。单元测试确保类和方法确实做了它应该做的事情。

PHPUnit的通用文档可以在以下地址找到:https://phpunit.de/documentation.html

要运行PHPUnit单元测试,执行以下命令:

phpunit PATH/TO/PROJECT/tests/

如果您需要代码覆盖率报告,请使用以下命令:

phpunit --coverage-html ./report PATH/TO/PROJECT/tests/

使用PHPUnit默认配置

phpunit --configuration PATH/TO/PROJECT/phpunit.xml

支持项目

非常感谢那些愿意帮助项目开发的人们。您可以通过以下方式帮助:

  • 添加错误报告或改进建议。
  • 通过发送Pull Request分享代码改进。
  • 为您所在的国家进行翻译或优化。
  • 修改文档。
  • 以及其他任何帮助。

许可证

此PHP库是在MIT许可证下开源的。有关更多信息,请参阅许可证文件

GitHub @cs-eliseev