PHPackages                             franzip/serp-page-serializer - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Parsing &amp; Serialization](/categories/parsing)
4. /
5. franzip/serp-page-serializer

ActiveLibrary[Parsing &amp; Serialization](/categories/parsing)

franzip/serp-page-serializer
============================

Serialize/deserialize Search Engine Result Pages to JSON and XML (JMS/Serializer wrapper).

1.0.0(2y ago)11432MITPHPPHP &gt;=8.0.0

Since May 14Pushed 2y agoCompare

[ Source](https://github.com/franzip/serp-page-serializer)[ Packagist](https://packagist.org/packages/franzip/serp-page-serializer)[ Docs](http://github.com/franzip/serp-page-serializer)[ RSS](/packages/franzip-serp-page-serializer/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (1)Dependencies (4)Versions (3)Used By (0)

[![Build Status](https://camo.githubusercontent.com/032906e9a805f168a474e84990ec97a606682c66b4b3fa7e7af58844d15f1daa/68747470733a2f2f7472617669732d63692e6f72672f6672616e7a69702f736572702d706167652d73657269616c697a65722e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/franzip/serp-page-serializer)[![Coverage Status](https://camo.githubusercontent.com/da112e64bd3b59f65806f8d6813311d2c0dee4e50e20c229c7bb1322175c88fd/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6672616e7a69702f736572702d706167652d73657269616c697a65722f62616467652e737667)](https://coveralls.io/r/franzip/serp-page-serializer)

SerpPageSerializer
==================

[](#serppageserializer)

Serialize/deserialize Search Engine Result Pages to JSON and XML (JMS/Serializer wrapper).

Installing via Composer (recommended)
-------------------------------------

[](#installing-via-composer-recommended)

Install composer in your project:

```
curl -s http://getcomposer.org/installer | php

```

Create a composer.json file in your project root:

```
{
    "require": {
        "franzip/serp-page-serializer": "1.0.*"
    }
}

```

Install via composer

```
php composer.phar install

```

Constructor
-----------

[](#constructor)

```
$serpSerializer = new SerpPageSerializer($cacheDir = "serializer_cache");
```

Data type constraints
---------------------

[](#data-type-constraints)

### Serialization

[](#serialization)

The `SerpPageSerializer->serialize()` method accepts only a `SerializableSerpPage`object and returns a `SerializedSerpPage` object. The serialized content is available through the `SerializedSerpPage->getContent()`method. Before using the serializer, normalize your data as follows:

```
use Franzip\SerpPageSerializer\Models\SerializableSerpPage;
// assuming you have extracted the data someway
$serializableSerpPage = new SerializableSerpPage($engine, $keyword, $pageUrl,
                                                 $pageNumber, $age, $entries);
```

Where:

1. `$engine` - string
    - Represents the Search Engine vendor (i.e. Google, Bing, etc).
2. `$keyword` - string
    - Represents the keyword associated to the Search Engine page
3. `$pageUrl` - string
    - Represents the url of the Search Engine for the given keyword/pageNumber
4. `$pageNumber` - integer
    - Represents the page number for the given Search Engine keyword search
5. `$age` - DateTime object
    - Represents when the data were extracted
6. `$entries` - array
    - Represents the core data (see below)

Every Search Engine result page entry has a tripartite structure:

1. A title, usually highlighted in blue.
2. A url.
3. A textual snippet.

[![Typical SERP entry structure](./serp-structure.png?raw=true "Typical SERP entry structure")](./serp-structure.png?raw=true)

The $entries array structure must resemble the above mentioned schema, where the sequential array index stands for the entry position in the page:

```
array(
      array('url' => 'someurl', 'snippet' => 'somesnippet', 'title' => 'sometitle'),
      array('url' => 'someurl', 'snippet' => 'somesnippet', 'title' => 'sometitle'),
      array('url' => 'someurl', 'snippet' => 'somesnippet', 'title' => 'sometitle'),
      ...
     );
```

### Deserialization

[](#deserialization)

The `SerpPageSerializer->deserialize()` only accepts a `SerializedSerpPage`as argument, yielding back a `SerpPageJSON` or a `SerpPageXML` object.

Usage (serialize data)
----------------------

[](#usage-serialize-data)

```
use Franzip\SerpPageSerializer\SerpPageSerializer;
use Franzip\SerpPageSerializer\Models\SerializableSerpPage;

$engine = 'google';
$keyword = 'foobar';
$pageUrl = 'https://www.google.com/search?q=foobar';
$pageNumber = 1;
$age = new \DateTime();
$age->setTimeStamp(time());
$entries = array(array('url' => 'www.foobar2000.org',
                       'title' => 'foobar2000',
                       'snippet' => 'blabla'),
                 array(...),
                 ...);

$serpSerializer = new SerpPageSerializer();
$pageToSerialize = new SerializableSerpPage($engine, $keyword, $pageUrl,
                                            $pageNumber, $age, $entries);

$serializedXMLData = $serpSerializer->serialize($pageToSerialize->getContent(), 'xml');
var_dump($serializedXMLData);

/*
 *
 *
 *
 *      www.foobar2000.org
 *      foobar2000
 *      blabla
 *
 *
 *      ...
 *
 *
 */

$serializedJSONData = $serpSerializer->serialize($pageToSerialize->getContent(), 'json');
var_dump($serializedJSONData);

/*
 * {
 *   "engine": "google",
 *   "page_number": 1,
 *   "page_url": "https:\/\/www.google.com\/search?q=foobar",
 *   "keyword":"foobar",
 *   "age":"2015-03-19",
 *   "entries":[
 *     {
 *       "position": 1,
 *       "url": "www.foobar2000.org",
 *       "title": "foobar2000",
 *       "snippet": "blabla"
 *     },
 *     {
 *       "position": 2,
 *       ...
 *     },
 *     ...
 *   ]
 * }
 */
```

Usage (deserialize data)
------------------------

[](#usage-deserialize-data)

```
use Franzip\SerpPageSerializer\SerpPageSerializer;

$serpSerializer = new SerpPageSerializer();

$serpPageXML = $serpSerializer->deserialize($serializedXMLPage, 'xml');

var_dump($serializedXMLPage);

// object(Franzip\SerpPageSerializer\Models\SerializedSerpPage) (1) {
// ...

var_dump($serpPageXML);

// object(Franzip\SerpPageSerializer\Models\SerpPageXML) (6) {
// ...

$serpPageJSON = $serpSerializer->deserialize($serializedJSONPage, 'json');

var_dump($serializedJSONPage);

// object(Franzip\SerpPageSerializer\Models\SerializedSerpPage) (1) {
// ...

var_dump($serpPageJSON);

// object(Franzip\SerpPageSerializer\Models\SerpPageJSON) (6) {
// ...
```

TODOs
-----

[](#todos)

- Add a default $cacheDir to constructor.
- A decent exceptions system.
- Allow typechecking on deserialization by wrapping serialized strings in a dedicated class.
- Fix serialization tests.
- Fix deserialization tests.
- Rewrite docs.
- CSV serialization/deserialization support.
- Fix messy tests.

License
-------

[](#license)

[MIT](http://opensource.org/licenses/MIT/ "MIT") Public License.

###  Health Score

24

—

LowBetter than 32% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity14

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity47

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

734d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/815354e0dcecb447e841e032ed3f02a985239704fbbebbd6cd48c360efed5b95?d=identicon)[franzip](/maintainers/franzip)

---

Top Contributors

[![franzip](https://avatars.githubusercontent.com/u/6237296?v=4)](https://github.com/franzip "franzip (40 commits)")

---

Tags

jsonxmlpageserializersearch engineSERP

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/franzip-serp-page-serializer/health.svg)

```
[![Health](https://phpackages.com/badges/franzip-serp-page-serializer/health.svg)](https://phpackages.com/packages/franzip-serp-page-serializer)
```

###  Alternatives

[jms/serializer-bundle

Allows you to easily serialize, and deserialize data of any complexity

1.8k89.3M627](/packages/jms-serializer-bundle)[goetas-webservices/xsd2php-runtime

Convert XSD (XML Schema) definitions into PHP classes

4910.9M36](/packages/goetas-webservices-xsd2php-runtime)[thunderer/serializard

Flexible serializer

2767.3k1](/packages/thunderer-serializard)[goetas/xsd2php-runtime

Convert XSD (XML Schema) definitions into PHP classes

493.3k](/packages/goetas-xsd2php-runtime)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
