PHPackages                             exelearning/elp-parser - 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. exelearning/elp-parser

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

exelearning/elp-parser
======================

Parse eXeLearning .elp files

v1.0.0(1mo ago)11282MITPHPPHP ^8.0CI passing

Since Nov 29Pushed 1mo ago2 watchersCompare

[ Source](https://github.com/exelearning/elp-parser)[ Packagist](https://packagist.org/packages/exelearning/elp-parser)[ RSS](/packages/exelearning-elp-parser/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (8)Dependencies (6)Versions (13)Used By (0)

eXeLearning `.elp` / `.elpx` Parser for PHP
===========================================

[](#exelearning-elp--elpx-parser-for-php)

Simple parser for eXeLearning project files.

 [Features](#features) | [Installation](#installation) | [Usage](#usage)

[![Packagist](https://camo.githubusercontent.com/9ffb7709ccc76fedcc90917f193094d5339214b18e39c00630c72926a107c4e1/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6578656c6561726e696e672f656c702d7061727365722e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/exelearning/elp-parser)[![Packagist](https://camo.githubusercontent.com/909dde8666b57eb050c5a8fc8cea9c2f338456d5b3dbcf41ba5e6a19c0873d62/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f646d2f6578656c6561726e696e672f656c702d7061727365722e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/exelearning/elp-parser)[![PHP from Packagist](https://camo.githubusercontent.com/69dfa2e459e7f4e61a21c7d1f49582dc0ec7529c411911d5d6b8bcdf0eb871fb/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f6578656c6561726e696e672f656c702d7061727365722e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/exelearning/elp-parser)

Features
--------

[](#features)

`ELPParser` supports the two eXeLearning project families described in the upstream format docs:

- Legacy `.elp` projects from eXeLearning 2.x based on `contentv3.xml`
- Modern `.elpx` projects from eXeLearning 3+ based on `content.xml` and ODE 2.0
- Modern `.elp` exports that also use `content.xml`
- Detection of eXeLearning major version when the package exposes it
- Heuristic detection of likely v4-style `.elpx` packages using root `content.dtd`
- Extraction of normalized metadata, strings, pages, idevices and asset references
- Safe archive extraction with ZIP path traversal checks
- JSON serialization support

For more information, visit the [documentation](https://exelearning.github.io/elp-parser/).

Requirements
------------

[](#requirements)

- PHP 8.0+
- Composer
- `zip` extension
- `simplexml` extension

Installation
------------

[](#installation)

```
composer require exelearning/elp-parser
```

Usage
-----

[](#usage)

### Basic Parsing

[](#basic-parsing)

```
use Exelearning\ELPParser;

try {
    $parser = ELPParser::fromFile('/path/to/project.elpx');

    $version = $parser->getVersion();
    $title = $parser->getTitle();
    $description = $parser->getDescription();
    $author = $parser->getAuthor();
    $license = $parser->getLicense();
    $language = $parser->getLanguage();

    foreach ($parser->getStrings() as $string) {
        echo $string . "\n";
    }
} catch (Exception $e) {
    echo "Error parsing project: " . $e->getMessage();
}
```

### Format Inspection

[](#format-inspection)

```
use Exelearning\ELPParser;

$parser = ELPParser::fromFile('/path/to/project.elpx');

echo $parser->getSourceExtension();      // elp | elpx
echo $parser->getContentFormat();        // legacy-contentv3 | ode-content
echo $parser->getContentFile();          // contentv3.xml | content.xml
echo $parser->getContentSchemaVersion(); // 2.0 for modern ODE packages
echo $parser->getExeVersion();           // raw upstream version string when present
echo $parser->getResourceLayout();       // none | content-resources | legacy-temp-paths | mixed
var_dump($parser->hasRootDtd());         // true when content.dtd exists at archive root
var_dump($parser->isLikelyVersion4Package());
```

### Pages and Assets

[](#pages-and-assets)

```
$pages = $parser->getPages();
$visiblePages = $parser->getVisiblePages();
$blocks = $parser->getBlocks();
$idevices = $parser->getIdevices();
$pageTexts = $parser->getPageTexts();
$visiblePageTexts = $parser->getVisiblePageTexts();
$firstPageText = $parser->getPageTextById($pages[0]['id']);
$teacherOnlyIdevices = $parser->getTeacherOnlyIdevices();
$hiddenIdevices = $parser->getHiddenIdevices();
$assets = $parser->getAssets();
$images = $parser->getImages();
$audioFiles = $parser->getAudioFiles();
$videoFiles = $parser->getVideoFiles();
$documents = $parser->getDocuments();
$assetsDetailed = $parser->getAssetsDetailed();
$orphanAssets = $parser->getOrphanAssets();
$metadata = $parser->getMetadata();
```

In modern `content.xml` packages, assets usually live under paths such as `content/resources/...`. Older projects and some transitional exports may still reference legacy layouts such as `files/tmp/...`. The parser exposes this through `getResourceLayout()`.

### Export JSON

[](#export-json)

```
$json = $parser->exportJson();
$parser->exportJson('/path/to/output.json');
```

### Extract Project Files

[](#extract-project-files)

```
$parser->extract('/path/to/destination');
```

Version Compatibility
---------------------

[](#version-compatibility)

The parser distinguishes between project format and eXeLearning version:

- `getContentFormat()` tells you whether the package uses legacy `contentv3.xml` or modern `content.xml`
- `getVersion()` reports the detected eXeLearning major version
- In practice this means:
    - eXeLearning 2.x legacy `.elp` =&gt; version `2`
    - modern ODE-based `.elp` =&gt; usually version `3`
    - `.elpx` packages with root `content.dtd` are treated as likely v4-style packages and currently report version `4`
    - otherwise modern ODE-based packages default to version `3`

This distinction matters because some projects created with newer eXeLearning builds still identify themselves internally with `exe_version=3.0`, so strict `v4` detection is not always possible from the package alone. For that reason, the library combines explicit metadata with format heuristics:

- `.elpx`
- `content.xml`
- root `content.dtd`
- optionally `content/resources/...` as the modern resource layout

Error Handling
--------------

[](#error-handling)

The parser throws exceptions for:

- Missing files
- Invalid ZIP archives
- Unsupported project layouts
- XML parsing failures
- Unsafe archive entries during extraction

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

###  Health Score

44

—

FairBetter than 92% of packages

Maintenance91

Actively maintained with recent releases

Popularity13

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity50

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 88.7% 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

Every ~70 days

Recently: every ~122 days

Total

8

Last Release

44d ago

Major Versions

v0.0.7 → v1.0.02026-04-05

### Community

Maintainers

![](https://www.gravatar.com/avatar/e5ea8bfbc980d75f631518d4ad799df45e9a576d7b19eed0ae9c613c65104251?d=identicon)[erseco](/maintainers/erseco)

---

Top Contributors

[![erseco](https://avatars.githubusercontent.com/u/1876752?v=4)](https://github.com/erseco "erseco (63 commits)")[![adevicef](https://avatars.githubusercontent.com/u/20083511?v=4)](https://github.com/adevicef "adevicef (5 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (2 commits)")[![pabloamayab](https://avatars.githubusercontent.com/u/90837177?v=4)](https://github.com/pabloamayab "pabloamayab (1 commits)")

---

Tags

elpexelearningparserparserexelearningelp

###  Code Quality

TestsPest

Code StylePHP\_CodeSniffer

### Embed Badge

![Health badge](/badges/exelearning-elp-parser/health.svg)

```
[![Health](https://phpackages.com/badges/exelearning-elp-parser/health.svg)](https://phpackages.com/packages/exelearning-elp-parser)
```

###  Alternatives

[nikic/php-parser

A PHP parser written in PHP

17.4k902.6M1.8k](/packages/nikic-php-parser)[doctrine/lexer

PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.

11.2k910.8M118](/packages/doctrine-lexer)[erusev/parsedown

Parser for Markdown.

15.0k151.8M732](/packages/erusev-parsedown)[league/commonmark

Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)

3.0k404.0M702](/packages/league-commonmark)[masterminds/html5

An HTML5 parser and serializer.

1.8k242.8M229](/packages/masterminds-html5)[sabberworm/php-css-parser

Parser for CSS Files written in PHP

1.8k191.2M65](/packages/sabberworm-php-css-parser)

PHPackages © 2026

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