转义HTML并以原始格式呈现



我希望有人能在这个问题上帮助我。

我正在从数据库中提取细节,以显示在一个小树枝模板上(使用Symfony2),但它保存在数据库中的方式使得很难解释HTML。

基本上,HTML标签已经被翻译成表格中的实体,例如:

<p>Bach Flower Crab Apple Remedy: the "cleansing" Remedy can be used both internally and externally </p><p><strong>

以此类推。我研究了twig中的渲染选项,并尝试了以下选项(基于我渲染产品描述的循环):

{% set strategy = 'html' %}
{% autoescape 'html' %}
{{ product.description|escape('html')|raw }}
{% endautoescape %}

{{ product.description|raw }}

第一个方法只是回显现有内容(作为实体),第二个方法只是将HTML标记呈现到页面,如下所示:

<p>Bach Flower Crab Apple Remedy: the "cleansing" Remedy can be used both internally and externally.</p><p><strong>...

因此,正如您所看到的,我无法找到一种方法来实际解释HTML标签,以便按照应有的方式显示描述。

有办法做到这一点吗?我不能在PHP中这样做因为它所做的只是向模板发送一个对象通过:

进行循环
public function showAction(Request $request, $store_id=0)
{
    $max = 1000;
    $repository = $this->getDoctrine()->getRepository('AppBundle:Product');
    $products = $repository->getProductsByStoreId($store_id,$max);
    $paginator  = $this->get('knp_paginator');
    $pagination = $paginator->paginate(
        $products,
        $request->query->get('page', 1),
        20
    );
    $return['products'] = $pagination;
    $return['categories'] = $this->getCategories();
    return $this->render('AppBundle:tables:productstable.html.twig', $return);
}

您的核心问题是您的数据库中没有HTML开始。在最好的情况下, Twig可以输出一些HTML实体,这些实体将显示为"

…",而在"最坏的"情况下,Twig将转义文本以准确地呈现其实际情况,即"

…"。期望Twig输出实际的HTML来呈现段落是不现实的,因为这根本不是原始数据所包含的内容。

您必须首先在PHP中对该文本进行html解码,然后使用..|raw在Twig中输出。raw意味着Twig将按原样输出它而不进一步转义它。由于从数据库获取数据到html_entity_decode是无稽之谈,因此您需要在这里修复数据输入 !不要 HTML对要进入数据库的数据进行编码,这没有任何意义。

我认为你必须编写自定义escaper插件来解码html实体,并像这样使用它:

{{ product.description|myawesomehtmlentitiesdecoder|raw }}

http://twig.sensiolabs.org/doc/filters/escape.html#custom-escapers参考

但是一般来说,最好将HTML存储在数据库中,然后对输出应用所需的安全过滤器。

相关内容

最新更新