php 从< p>Twig的markdown_to_html()中删除标签

piv4azn7  于 2023-02-15  发布在  PHP
关注(0)|答案(2)|浏览(154)

我使用的是Twig的 markdown_to_html 滤镜,效果非常好。
然而,在某些用例中,我希望它生成HTML,但不包含段落标记。
例如,在此降价内容中:

Hello, this is **some Markdown**

我希望导出的HTML为:

Hello, this is <strong>some Markdown</strong>

但目前的结果是:

<p>Hello, this is <strong>some Markdown</strong></p>

我调查了过滤器的来源,并没有看到任何选项这样做。
有没有办法做到这一点,或者我应该创建自己的细枝过滤器?
如果可能的话,我宁愿避免使用striptags过滤器,因为我不想列出所有我允许使用的标签(除非有一个反向striptags,您可以在其中指定要删除的标签?)

q3qa4bjr

q3qa4bjr1#

看起来你正在使用league/commonmark,它有一个"Inlines Only" extension来实现这个目的!它将避免输出块级元素,如段落,标题等-只有像强调和链接这样的东西会被呈现为HTML。
要使用它,请按如下方式构建Markdown转换器:

<?php

use League\CommonMark\Environment\Environment;
use League\CommonMark\Extension\InlinesOnly\InlinesOnlyExtension;
use League\CommonMark\MarkdownConverter;

// Define your configuration, if needed
$config = [];

// Create a new, empty environment
$environment = new Environment($config);

// Add this extension
$environment->addExtension(new InlinesOnlyExtension());

// Instantiate the converter engine and start converting some Markdown!
$converter = new MarkdownConverter($environment);
echo $converter->convert('Hello, this is **some Markdown**');

这将比使用正则表达式解析HTML更可靠。
(我是league/commonmark的维护者,很乐意回答您在评论中可能提出的任何后续问题)

ehxuflar

ehxuflar2#

我更新了我的过滤器,遵循Colin O'Dells answer。这样,它更健壮,并且它将允许在未来使用或创建更多的CommonMark扩展。

# src\Twig\CustomTwigExtension.php
<?php

declare(strict_types=1);

namespace App\Twig;

use League\CommonMark\Environment\Environment;
use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension;
use League\CommonMark\Extension\ConfigurableExtensionInterface;
use League\CommonMark\Extension\InlinesOnly\InlinesOnlyExtension;
use League\CommonMark\MarkdownConverter;
use Twig\Extension\AbstractExtension;
use Twig\Markup;
use Twig\TwigFilter;
use Webmozart\Assert\Assert;

class CustomTwigExtension extends AbstractExtension
{
    private const CONFIG = [
        'default' => [CommonMarkCoreExtension::class],
        'inline' => [InlinesOnlyExtension::class],
    ];

    /**
     * @return TwigFilter[]
     */
    public function getFilters(): array
    {
        return [
            new TwigFilter('custom_markdown', [$this, 'customMarkdown']),
        ];
    }

    public function customMarkdown(string $str, string $configName = 'default'): Markup
    {
        $env = new Environment();
        foreach ($this->getExtensions($configName) as $extension) {
            $env->addExtension($extension);
        }
        $converter = new MarkdownConverter($env);
        $html = $converter->convert($str)->getContent();

        return new Markup($html, 'UTF-8');
    }

    /**
     * @return ConfigurableExtensionInterface[]
     */
    private function getExtensions(string $configName): array
    {
        Assert::keyExists(self::CONFIG, $configName);

        $extensions = [];
        foreach (self::CONFIG[$configName] as $extension) {
            $extensions[] = new $extension();
        }

        return $extensions;
    }
}

它在模板中的名称如下:

{{ markdown_content|custom_markdown }} {# to use the default markdown configuration #}

{{ markdown_content|custom_markdown('inline') }} {# to remove all paragraph tags from the result #}

相关问题