如何移除Twig中markdown_to_html()生成的<p>标签?
解决方案
临时快速处理(单段落场景)
直接用Twig自带的replace过滤器配合markdown_to_html,精准移除首尾的<p>和</p>标签:
{{ your_markdown_content|markdown_to_html|replace({'<p>': '', '</p>': ''}) }}
这个方法适配你示例里的单段落Markdown内容,既能去掉外层的<p>标签,又能完整保留<strong>这类格式化标签。
更通用的自定义过滤器(复杂场景推荐)
如果需要处理多段落或更复杂的Markdown内容,建议自定义Twig过滤器,从Markdown解析层面直接控制是否生成<p>标签:
- 以Symfony环境为例,自定义过滤器时调整CommonMark(Twig默认Markdown解析库)的渲染逻辑:
use Twig\Extension\AbstractExtension; use Twig\TwigFilter; use League\CommonMark\Environment\Environment; use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension; use League\CommonMark\Renderer\HtmlRenderer; use League\CommonMark\Node\Block\Paragraph; use League\CommonMark\Output\RenderedContent; class CustomMarkdownExtension extends AbstractExtension { public function getFilters(): array { return [ new TwigFilter('markdown_no_p', [$this, 'convertMarkdownWithoutP']), ]; } public function convertMarkdownWithoutP(string $markdown): string { $config = [ 'renderer' => [ 'block_separator' => "\n", 'inner_separator' => "\n", ], ]; $environment = new Environment($config); $environment->addExtension(new CommonMarkCoreExtension()); // 替换默认段落渲染器,直接输出内容不包裹<p>标签 $environment->addRenderer(Paragraph::class, new class extends \League\CommonMark\Extension\CommonMark\Renderer\Block\ParagraphRenderer { public function render(Paragraph $node, HtmlRenderer $htmlRenderer): RenderedContent { return $htmlRenderer->renderNodes($node->children()); } }); $renderer = new HtmlRenderer($environment); $document = $environment->getParser()->parse($markdown); return $renderer->renderDocument($document); } }
- 注册扩展后,就能在Twig里直接使用这个自定义过滤器:
{{ your_markdown_content|markdown_no_p }}
这种方法从根源上控制Markdown的输出格式,不会额外生成<p>标签,适配各种复杂场景。
为什么不推荐用striptags
striptags会移除所有HTML标签,包括你需要保留的<strong>这类格式化标签,完全不符合需求,所以不建议使用。
内容的提问来源于stack exchange,提问作者Orange Lux
相关产品推荐
相关产品推荐

