league/commonmark
Extensible PHP Markdown parser supporting the full CommonMark spec and GitHub-Flavored Markdown. Works with PHP 7.4+ (mbstring) and provides simple converters to turn Markdown into HTML with configurable safety options.
EmojiExtension, TableExtension) remain compatible.vbscript:, file:, or data: were incorrectly blocked. This aligns with Laravel’s security-first approach, particularly for user-generated content.Markdown facade and Blade integration remain seamless.CommonMarkConverter remains usable in Laravel’s console commands or routes without framework overhead.data: or file: URLs (e.g., for internal documentation). Clarify whether such URLs are expected in your use case. ```php within 1. ).vbscript:, file:, or data: in non-malicious contexts (e.g., https://example.com?data=value).Markdown facade and GrahamCampbell/Laravel-Markdown wrapper remain fully compatible.$this->app->singleton(CommonMarkConverter::class, function ($app) {
return new CommonMarkConverter([
'html_input' => 'strip',
'allow_unsafe_links' => false, // Critical for security
'extensions' => [/* ... */],
]);
});
composer update league/commonmark graham-campbell/laravel-markdown
data:, file:, or vbscript: in non-malicious contexts.mbstring remains mandatory (enabled by default in Laravel).utf8mb4_unicode_ci) is still recommended.composer update league/commonmark@^2.8.3
allow_unsafe_links is set to false in config/markdown.php (if using the Laravel wrapper).composer.json:
"league/commonmark": "^2.8"
2.8.2 if issues arise:
composer require league/commonmark:2.8.2
$xml = (new MarkdownToXmlConverter())->convert($markdown);
try {
$html = Markdown::parse($userInput);
} catch (\Exception $e) {
\Log::warning('Markdown parsing failed', [
'input' => Str::limit($userInput, 200),
'error' => $e->getMessage(),
]);
}
$html = Cache::remember("markdown_{$post->id}", now()->addHours(1), function () use ($post) {
return Markdown::parse($post->content);
});
allow_unsafe_links is never set to true for user-generated content.html_input => 'strip' and allow_unsafe_links => false as defaults.<a> tags or malformed links.parsedown/parsedown) for unsupported edge cases. ```` inside1. ` lists").data: URLs are now allowed if not malicious").1. Indented code:
```php
echo "Hello";
data: URL:
[Click here](https://example.com?data=test)
public function testTabIndentedCodeInList()
{
$markdown = "1. Indented code:\n ```php\n echo 'Hello';\n ```";
$html = Markdown::parse($markdown);
$this->assert
How can I help you explore Laravel packages today?