Highly-extensible PHP Markdown parser which fully supports the CommonMark and GFM specs.

Overview

league/commonmark

Latest Version Total Downloads Software License Build Status Coverage Status Quality Score CII Best Practices

Sponsor development of this project

league/commonmark

league/commonmark is a highly-extensible PHP Markdown parser created by Colin O'Dell which supports the full CommonMark spec and Github-Flavored Markdown. It is based on the CommonMark JS reference implementation by John MacFarlane (@jgm).

📦 Installation & Basic Usage

This project requires PHP 7.2 or higher with the mbstring extension. To install it via Composer simply run:

$ composer require league/commonmark

The CommonMarkConverter class provides a simple wrapper for converting CommonMark to HTML:

use League\CommonMark\CommonMarkConverter;

$converter = new CommonMarkConverter([
    'html_input' => 'strip',
    'allow_unsafe_links' => false,
]);

echo $converter->convertToHtml('# Hello World!');

// <h1>Hello World!</h1>

Or if you want Github-Flavored Markdown, use the GithubFlavoredMarkdownConverter class instead:

use League\CommonMark\GithubFlavoredMarkdownConverter;

$converter = new GithubFlavoredMarkdownConverter([
    'html_input' => 'strip',
    'allow_unsafe_links' => false,
]);

echo $converter->convertToHtml('# Hello World!');

// <h1>Hello World!</h1>

Please note that only UTF-8 and ASCII encodings are supported. If your Markdown uses a different encoding please convert it to UTF-8 before running it through this library.

🔒 If you will be parsing untrusted input from users, please consider setting the html_input and allow_unsafe_links options per the example above. See https://commonmark.thephpleague.com/security/ for more details. If you also do choose to allow raw HTML input from untrusted users, considering using a library (like HTML Purifier) to provide additional HTML filtering.

📓 Documentation

Full documentation on advanced usage, configuration, and customization can be found at commonmark.thephpleague.com.

Upgrading

Information on how to upgrade to newer versions of this library can be found at https://commonmark.thephpleague.com/releases.

💻 Github-Flavored Markdown

The GithubFlavoredMarkdownConverter shown earlier is a drop-in replacement for the CommonMarkConverter which adds additional features found in the GFM spec:

  • Autolinks
  • Disallowed raw HTML
  • Strikethrough
  • Tables
  • Task Lists

See the Extensions documentation for more details on how to include only certain GFM features if you don't want them all.

🗃️ Related Packages

Integrations

Included Extensions

See our extension documentation for a full list of extensions bundled with this library.

Community Extensions

Custom parsers/renderers can be bundled into extensions which extend CommonMark. Here are some that you may find interesting:

Others can be found on Packagist under the commonmark-extension package type.

If you build your own, feel free to submit a PR to add it to this list!

Others

Check out the other cool things people are doing with league/commonmark: https://packagist.org/packages/league/commonmark/dependents

🏷️ Versioning

SemVer is followed closely. Minor and patch releases should not introduce breaking changes to the codebase; however, they might change the resulting AST or HTML output of parsed Markdown (due to bug fixes, spec changes, etc.) As a result, you might get slightly different HTML, but any custom code built onto this library should still function correctly.

Any classes or methods marked @internal are not intended for use outside of this library and are subject to breaking changes at any time, so please avoid using them.

🛠️ Maintenance & Support

When a new minor version (e.g. 1.4 -> 1.5) is released, the previous one (1.4) will continue to receive security and critical bug fixes for at least 3 months.

When a new major version is released (e.g. 1.5 -> 2.0), the previous one (1.5) will receive critical bug fixes for at least 3 months and security updates for 6 months after that new release comes out.

(This policy may change in the future and exceptions may be made on a case-by-case basis.)

Professional support, including notification of new releases and security updates, is available through a Tidelift Subscription.

👷‍♀️ Contributing

To report a security vulnerability, please use the Tidelift security contact. Tidelift will coordinate the fix and disclosure with us.

If you encounter a bug in the spec, please report it to the CommonMark project. Any resulting fix will eventually be implemented in this project as well.

Contributions to this library are welcome, especially ones that:

Major refactoring to core parsing logic should be avoided if possible so that we can easily follow updates made to the reference implementation. That being said, we will absolutely consider changes which don't deviate too far from the reference spec or which are favored by other popular CommonMark implementations.

Please see CONTRIBUTING for additional details.

🧪 Testing

$ composer test

This will also test league/commonmark against the latest supported spec.

🚀 Performance Benchmarks

You can compare the performance of league/commonmark to other popular parsers by running the included benchmark tool:

$ ./tests/benchmark/benchmark.php

👥 Credits & Acknowledgements

This code is partially based on the CommonMark JS reference implementation which is written, maintained and copyrighted by John MacFarlane. This project simply wouldn't exist without his work.

Sponsors

We'd also like to extend our sincere thanks the following sponsors who support ongoing development of this project:

Are you interested in sponsoring development of this project? See https://www.colinodell.com/sponsor for a list of ways to contribute.

📄 License

league/commonmark is licensed under the BSD-3 license. See the LICENSE file for more details.

🏛️ Governance

This project is primarily maintained by Colin O'Dell. Members of the PHP League Leadership Team may occasionally assist with some of these duties.

🗺️ Who Uses It?

This project is used by Drupal, Laravel Framework, Cachet, Firefly III, Neos, Daux.io, and more!


Get professional support for league/commonmark with a Tidelift subscription
Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies.
Comments
  • Question: How to add classes on specific node ?

    Question: How to add classes on specific node ?

    Question

    I have a common markdown content, without any specific attributes. When rendering markdown to HTML, I want to see some CSS Classes on HTML nodes.

    Let's say :

    • All H1 nodes : .title-main
    • All Table nodes : .table
    • All Table Row nodes : .table .table-row

    Is this possible without creating custom renderer ?

    It could be awesome to be able to configure using the environment :

    $config = [
      'html_classes' => [
        'h1' => '.title-main',
        'table' => '.table',
      ],
    ];
    

    The use case is : I'm using a bought theme that request some css class. I don't want to change markdown original content, and I don't want to change theme.

    Thank a lot for your awesome job on this package !

    Regards,

    enhancement question do not close 
    opened by armetiz 22
  • WIP: Double-linked list based AST

    WIP: Double-linked list based AST

    • [x] Add base Node object which uses double-linked list
    • [x] Cleanup deprecated methods calls
    • [x] Add NodeWalker
    • [x] Simplify inline parsers
    • [x] Cleanup code

    This PR includes major refactoring of current commonmark implementation

    Changes

    • Double-linked list based AST
    • Simplified Delimiters and Inline parsers: instead of storing position, we now can store InlineNode.
    • Ability to modify AST in runtime by using NodeWalkers
    • AbstractInlineContainer replaced with InlineContainer interface

    NodeWalker

    NodeWalker can be used to change AST in runtime. Each node has walker method, which will create node walker for given node. Here is example of how to capitalize all emphasis in document:

    $doc = 'Hello *world*';
    
    $ast = $parser->parse($doc);
    $walker = $ast->walker();
    $inEmphasis = false;
    
    while (($event = $walker->next())) {
        $node = $event->getNode();
        if ($node instanceof Emphasis) {
            if ($event->isEntering()) {
                $inEmphasis = true;
            } else {
                $inEmphasis = false;
                // add Emphasis node's children as siblings
                while($node->firstChild()) {
                    $node->insertBefore($node->firstChild());
                }
                // remove the empty Emphasis node
                $node->detach();
            }
        } else if ($inEmphasis && $node instanceof Text) {
            $node->setContent(strtoupper($node->getContent()));
        }
    }
    
    $html = $renderer->renderBlock($ast); // <p>Hello WORLD</p>
    
    enhancement 
    opened by fesor 22
  • How do I add custom directives?

    How do I add custom directives?

    Given that @philsturgeon nearly wet his pants in excitement about this repo, I figured I'd check it out. I've been using cebe/markdown as a base parser - with extensions for leanpub's garbage - and while I'd like to switch to this, I haven't been able to figure out where I should hook into to add custom directives.

    Any thoughts on how I might go about this?

    opened by josegonzalez 21
  • PECL Extension

    PECL Extension

    So this is more of an open-ended question of sorts.

    Are there any plans for providing a PECL compatible extension of this project?

    It'd be nice to have the power/speed of https://github.com/commonmark/cmark that mimic this project's APIs.

    I've found https://github.com/krakjoe/cmark, but it seems to be a completely custom and standalone implementation.

    question performance 
    opened by markhalliwell 18
  • [2.0] Revise configuration approach

    [2.0] Revise configuration approach

    Our approach to configuration has a few shortcomings:

    • No support for providing default values, overriding them during MD->HTML conversion, and then rolling back before subsequent conversions
    • No support for validating types
    • Too many ways to set, get, and override configurations, some of which support /-delimited paths and others that don't
    • ConfigurationAwareInterface potentially allows people to pull configuration values out immediately instead of hanging onto the ConfigurationInterface object and lazily checking values later - the latter is recommended, but we don't document that anywhere.
    • It's basically a free-for-all

    The current approach works well enough for 1.x, but it's going to prevent some features like #442 being able to override configuration values (without causing weird side effects)

    I'd therefore like to revisit how we implement, handle, and document Configuration within this library for v2.

    enhancement feedback wanted discussion implemented 
    opened by colinodell 13
  • Add a new `html_input` option

    Add a new `html_input` option

    See #253, this is still WIP. That was easier than I thought, however I think it will require some more thinking. I'm pushing it "as-is" so that we can progress on what to do:

    • what name for the option controlling "allowing unsafe links"?
    • do the constants on the Environment class make sense to you?

    Feel free to send any other comment about the code, including small coding style stuff, I don't mind at all.

    The new html_input option allows 3 different behaviors:

    • strip HTML input
    • allow HTML input
    • escape HTML input
    opened by mnapoli 13
  • Add ability to configure characters and disable emphasis/strong

    Add ability to configure characters and disable emphasis/strong

    • [x] Option to disable parsing of _
    • [x] Option to disable parsing of *
    • [x] Option to disable rendering of emphasis
    • [x] Option to disable rendering of strong
    • [x] Tests

    Is this something you would be open to taking into core? If so, I'll write some tests for it. (Any suggestions for how the tests should be organized?)

    enhancement 
    opened by 0b10011 13
  • Support for multiple renderers

    Support for multiple renderers

    My use case is that I need custom renderers for images and depending on the image URL, these renders will render the image as an iframe for YouTube, Vimeo, etc. At present I use the Sundown renderer and I have stuffed all these renderers into one big file but would like to move over to this lib and cleanup the mess while I'm at it.

    I also imagine that a lot of contributors can then share their own YoutubeRenderer (or generic VideoRenderer). This would make extensibility a lot more fun and build an ecosystem around it. Maybe even give way to an extensions repo.

    Based on your suggestion in #32, I currently render my custom Renderer as

    $environment->addInlineRenderer('League\CommonMark\Inline\Element\Image', new MediaRenderer());
    

    However, this only allows attaching a single renderer. It would be nice if the renderer can work sort of like conventional event handlers with the possibility to either chain the output as input to other renderers or stop propagation. The easiest approach would be to have symmetric input/output for renderers that would make chaining a breeze. Currently the input/output is (AbstractInline, HtmlRenderer)/HtmlElement.

    enhancement up-for-grabs feedback wanted 
    opened by aleemb 13
  • RFC: Moving BacktickParser to a delimiter processor?

    RFC: Moving BacktickParser to a delimiter processor?

    Description I'm implementing a Jira ticket format parser as an InlineParserInterface. I think I'm in the ballpark, but I've stumbled with this: I can't apply the transformation if the ticket name is between backticks, and I think the reason is that backticks are implemented as InlineParserInterface too.

    If I'm understanding the docs, backticks would be ideally implemented as DelimiterProcessorInterface: image

    • Do you think it would be reasonable to allow transformations to happen inside backticks?
    • It would be a problem in terms of backwards compatibility?
    • I think I could try to make a PR. I'm still not familiar with this package internals, so I would do my best.

    Example

    test FOO-123 <!-- this will output 'test <a href="https://foo.atlassian.net/browse/FOO-123">FOO-123</a>' -->
    
    `test FOO-123` <!-- this will output '<pre>test FOO-123</pre>' -->
    

    Did this project help you today? Did it make you happy in any way?

    Of course. This is allowing me to do a cool view of our changelog for our non-programmer co-workers! I'm very thankful to have such control over the parsing, and I would love to contribute back if I can.

    enhancement 
    opened by devnix 12
  • Feature Request: Merge Attributes and Footnotes Extensions

    Feature Request: Merge Attributes and Footnotes Extensions

    Given that this project has now consolidated a ton of these rando extensions into itself, I think the last two remaining popular extensions should follow suit:

    • [x] https://github.com/webuni/commonmark-attributes-extension
    • [x] https://github.com/rezozero/commonmark-ext-footnotes

    x-ref: https://github.com/rezozero/commonmark-ext-footnotes/issues/7

    enhancement do not close implemented 
    opened by markhalliwell 12
  • Consider renaming the master branch

    Consider renaming the master branch

    Not that this really needs any explanation, but for posterity sake I suppose: https://www.zdnet.com/article/github-to-replace-master-with-alternative-term-to-avoid-slavery-references/

    implemented 
    opened by markhalliwell 11
  • Enable the restriction of attributes

    Enable the restriction of attributes

    Description

    I would like to customize the extension https://commonmark.thephpleague.com/2.3/extensions/attributes/ so that you can limit the attributes of the user by configuration. Currently I give the user too much freedom once the extension is activated because e.g. I only want the user to be able to set values for bootstrap pull-left as class.

    If restricted is true (default: false that there is no BC), then only the keys in the configuration are allowed. If false, then only the values of the specified keys are restricted.

    Example

    'attributes' => [
        'restricted' => true,
        'class' => ['multiple value', 'allowed'],
        'id' => 'allowed_value',
        'title' => function ($value) {
            if (strlen($value) > 10) {
                return true;
            } else {
                return false;
           }
        },
        // Allow the key and accept any value in case the restricted is true
        'font' => null,
    ]
    

    Did this project help you today? Did it make you happy in any way?

    No response

    enhancement 
    opened by MrSpoocy 3
  • Smart Punctuation is incorrect on RTL direction

    Smart Punctuation is incorrect on RTL direction

    Version(s) affected

    2.3

    Description

    In RTL languages the smart punctuation should be reversed so 'رہیں' generates ’رہیں‘ instead of the desired ‘رہیں’.

    It's possible to change up the config to reverse the open/close but language detection (especially for bilingual setups) would be very useful.

    up-for-grabs 
    opened by aleemb 1
  • Re-evaluate dependencies

    Re-evaluate dependencies

    I really liked how v1 had no external dependencies. In v2 we opted to pull in some dependencies instead of reinventing the wheel. I think this was a good decision, but do we truly need everything in that dependency tree? Maybe yes, maybe no. Let's explore if it's reasonable to reduce that footprint in any ways that don't negatively impact users or maintainers. (We don't want to just remove things for the sake of removing things). This way involve some major-version-level changes to league/config as well.

    We'll either confirm that we have exactly what we want/need, or we'll find areas to make small improvements.

    do not close 
    opened by colinodell 0
  • Refactor rendering approach

    Refactor rendering approach

    There are several rendering-related ideas I'd like to explore for v3:

    • [ ] Avoiding recursion (parsing and AST iteration already avoid recursion)
    • [ ] Using an OutputWriter object
    • [ ] Investigate performance of writing to a php://memory stream instead of concatenating strings
    • [ ] Allowing renderers to determine what to render (à la Symfony's NormalizerInterface) so that renderers could potentially handle multiple node types without needing to tell the Environment in advance
    • [ ] Better support for multiple render formats (html, md, xml)

    Whether these actually get implemented will depend on how the testing goes.

    enhancement performance do not close 
    opened by colinodell 0
  • HTML to Markdown

    HTML to Markdown

    #419 and #511 require the ability to render the AST to Markdown. If we also add the ability to parse HTML into the AST then we could replace league/html-to-markdown with this package! Using an intermediate AST would also help with some of the issues/challenges in the other library.

    enhancement do not close 
    opened by colinodell 0
Releases(2.3.8)
  • 2.3.8(Dec 10, 2022)

  • 2.3.7(Nov 17, 2022)

  • 2.3.6(Oct 30, 2022)

  • 2.3.5(Jul 29, 2022)

  • 2.3.4(Jul 17, 2022)

    Changed

    • Made a number of small tweaks to the embed extension's parsing behavior to fix #898:
      • Changed EmbedStartParser to always capture embed-like lines in container blocks, regardless of parent block type
      • Changed EmbedProcessor to also remove Embed blocks that aren't direct children of the Document
      • Increased the priority of EmbedProcessor to 1010

    Fixed

    • Fixed EmbedExtension not parsing embeds following a list block (#898)
    Source code(tar.gz)
    Source code(zip)
  • 2.3.3(Jun 7, 2022)

  • 2.3.2(Jun 3, 2022)

  • 2.2.5(Jun 3, 2022)

  • 2.3.1(May 14, 2022)

  • 2.2.4(May 14, 2022)

  • 2.3.0(Apr 7, 2022)

    Added

    • Added new EmbedExtension (#805)
    • Added DocumentRendererInterface as a replacement for the now-deprecated MarkdownRendererInterface

    Deprecated

    • Deprecated MarkdownRendererInterface; use DocumentRendererInterface instead
    Source code(tar.gz)
    Source code(zip)
  • 2.2.3(Feb 26, 2022)

  • 2.1.3(Feb 26, 2022)

  • 2.0.4(Feb 26, 2022)

  • 2.2.2(Feb 13, 2022)

  • 2.1.2(Feb 13, 2022)

  • 2.0.3(Feb 13, 2022)

  • 2.2.1(Jan 25, 2022)

  • 2.2.0(Jan 22, 2022)

    Added

    • Added new ConverterInterface
    • Added new MarkdownToXmlConverter class
    • Added new HtmlDecorator class which can wrap existing renderers with additional HTML tags
    • Added new table/wrap config to apply an optional wrapping/container element around a table (#780)

    Changed

    • HtmlElement contents can now consist of any Stringable, not just HtmlElement and string

    Deprecated

    • Deprecated MarkdownConverterInterface and its convertToHtml() method; use ConverterInterface and convert() instead
    Source code(tar.gz)
    Source code(zip)
  • 1.6.7(Jan 13, 2022)

    Changed

    • Added ReturnTypeWillChange attribute to prevent PHP 8.1 deprecation warnings (#785)
    • Coerced punctuation counts to integers to ensure floats are never used
    Source code(tar.gz)
    Source code(zip)
  • 2.1.1(Jan 2, 2022)

  • 2.1.0(Dec 5, 2021)

    Added

    • Added support for ext-yaml in FrontMatterExtension (#715)
    • Added support for symfony/yaml v6.0 in FrontMatterExtension (#739)
    • Added new heading_permalink/aria_hidden config option (#741)

    Fixed

    • Fixed PHP 8.1 deprecation warning (#759, #762)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.2(Aug 14, 2021)

    Changed

    • Bumped minimum version of league/config to support PHP 8.1

    Fixed

    • Fixed ability to register block parsers that identify lines starting with letters (#706)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(Jul 31, 2021)

    Fixed

    • Fixed nested autolinks (#689)
    • Fixed description lists being parsed incorrectly (#692)
    • Fixed Table of Contents not respecting Heading Permalink prefixes (#690)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(Jul 24, 2021)

  • 2.0.0-rc2(Jul 17, 2021)

  • 1.6.6(Jul 17, 2021)

  • 2.0.0-rc1(Jul 10, 2021)

  • 2.0.0-beta3(Jul 3, 2021)

    Changed

    • Any leading UTF-8 BOM will be stripped from the input
    • The getEnvironment() method of CommonMarkConverter and GithubFlavoredMarkdownConverter will always return the concrete, configurable Environment for upgrading convenience
    • Optimized AST iteration
    • Lots of small micro-optimizations
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0-beta2(Jun 27, 2021)

    See https://commonmark.thephpleague.com/2.0/upgrading/ for detailed information on upgrading to version 2.0.

    Added

    • Added new Node::iterator() method and NodeIterator class for faster AST iteration (#683, #684)

    Changed

    • Made compatible with CommonMark spec 0.30.0
    • Optimized link label parsing
    • Optimized AST iteration for a 50% performance boost in some event listeners (#683, #684)

    Fixed

    • Fixed processing instructions with EOLs
    • Fixed case-insensitive matching for HTML tag types
    • Fixed type 7 HTML blocks incorrectly interrupting lazy paragraphs
    • Fixed newlines in reference labels not collapsing into spaces
    • Fixed link label normalization with escaped newlines
    • Fixed unnecessary AST iteration when no default attributes are configured
    Source code(tar.gz)
    Source code(zip)
Owner
The League of Extraordinary Packages
A group of developers who have banded together to build solid, well tested PHP packages using modern coding standards.
The League of Extraordinary Packages
Parser for Markdown and Markdown Extra derived from the original Markdown.pl by John Gruber.

PHP Markdown PHP Markdown Lib 1.9.0 - 1 Dec 2019 by Michel Fortin https://michelf.ca/ based on Markdown by John Gruber https://daringfireball.net/ Int

Michel Fortin 3.3k Jan 1, 2023
Better Markdown Parser in PHP

Parsedown Better Markdown Parser in PHP - Demo. Features One File No Dependencies Super Fast Extensible GitHub flavored Tested in 5.3 to 7.3 Markdown

Emanuil Rusev 14.3k Jan 8, 2023
A New Markdown parser for PHP5.4

Ciconia - A New Markdown Parser for PHP The Markdown parser for PHP5.4, it is fully extensible. Ciconia is the collection of extension, so you can rep

Kazuyuki Hayashi 357 Jan 3, 2023
php html parser,类似与PHP Simple HTML DOM Parser,但是比它快好几倍

HtmlParser php html解析工具,类似与PHP Simple HTML DOM Parser。 由于基于php模块dom,所以在解析html时的效率比 PHP Simple HTML DOM Parser 快好几倍。 注意:html代码必须是utf-8编码字符,如果不是请转成utf-8

俊杰jerry 522 Dec 29, 2022
UpToDocs scans a Markdown file for PHP code blocks, and executes each one in a separate process.

UpToDocs UpToDocs scans a Markdown file for PHP code blocks, and executes each one in a separate process. Include this in your CI workflows, to make s

Mathias Verraes 56 Nov 26, 2022
Plug and play flat file markdown blog for your Laravel-projects

Ampersand Plug-and-play flat file markdown blog tool for your Laravel-project. Create an article or blog-section on your site without the hassle of se

Marcus Olsson 22 Dec 5, 2022
Convert HTML to Markdown with PHP

HTML To Markdown for PHP Library which converts HTML to Markdown for your sanity and convenience. Requires: PHP 7.2+ Lead Developer: @colinodell Origi

The League of Extraordinary Packages 1.5k Dec 28, 2022
An HTML5 parser and serializer for PHP.

HTML5-PHP HTML5 is a standards-compliant HTML5 parser and writer written entirely in PHP. It is stable and used in many production websites, and has w

null 1.2k Dec 31, 2022
Advanced shortcode (BBCode) parser and engine for PHP

Shortcode Shortcode is a framework agnostic PHP library allowing to find, extract and process text fragments called "shortcodes" or "BBCodes". Example

Tomasz Kowalczyk 358 Nov 26, 2022
Efficient, easy-to-use, and fast PHP JSON stream parser

JSON Machine Very easy to use and memory efficient drop-in replacement for inefficient iteration of big JSON files or streams for PHP 5.6+. See TL;DR.

Filip Halaxa 801 Dec 28, 2022
📜 Modern Simple HTML DOM Parser for PHP

?? Simple Html Dom Parser for PHP A HTML DOM parser written in PHP - let you manipulate HTML in a very easy way! This is a fork of PHP Simple HTML DOM

Lars Moelleken 665 Jan 4, 2023
Parsica - PHP Parser Combinators - The easiest way to build robust parsers.

Parsica The easiest way to build robust parsers in PHP.

null 0 Feb 22, 2022
This is a php parser for plantuml source file.

PlantUML parser for PHP Overview This package builds AST of class definitions from plantuml files. This package works only with php. Installation Via

Tasuku Yamashita 5 May 29, 2022
A PHP hold'em range parser

mattjmattj/holdem-range-parser A PHP hold'em range parser Installation No published package yet, so you'll have to clone the project manually, or add

Matthias Jouan 1 Feb 2, 2022
A lightweight lexical string parser for BBCode styled markup.

Decoda A lightweight lexical string parser for BBCode styled markup. Requirements PHP 5.6.0+ Multibyte Composer Contributors "Marten-Plain" emoticons

Miles Johnson 194 Dec 27, 2022
Simple URL parser

urlparser Simple URL parser This is a simple URL parser, which returns an array of results from url of kind /module/controller/param1:value/param2:val

null 1 Oct 29, 2021
This is a simple, streaming parser for processing large JSON documents

Streaming JSON parser for PHP This is a simple, streaming parser for processing large JSON documents. Use it for parsing very large JSON documents to

Salsify 687 Jan 4, 2023
A simple PHP scripting application which fetch emails from your Gmail account according to a filter and parses them for information.

A simple PHP scripting application which fetch emails from your Gmail account according to a filter and parses them for information.

Haitham Sweilem 1 Jan 18, 2022
HTML sanitizer, written in PHP, aiming to provide XSS-safe markup based on explicitly allowed tags, attributes and values.

TYPO3 HTML Sanitizer ℹ️ Common safe HTML tags & attributes as given in \TYPO3\HtmlSanitizer\Builder\CommonBuilder still might be adjusted, extended or

TYPO3 GitHub Department 22 Dec 14, 2022