当前位置: 首页 > 知识库问答 >
问题:

用Twig(在Symfony中)解码存储在MySQL中的HTML实体

赵俊晤
2023-03-14

我有一个MySQL数据库,其中有些内容是用Ckeditor创建的。文本存储方式如下:

l’automatisation des systemè;mes dans le monde,HTML实体也是如此。

对于Twig,在Symfony项目中,当我要显示数据时,我对此字段使用{{article.myTextraw}}但它显示

L’Automatisation des System&eGrave;Mes dans le Monde所以它没有完全解码和解释...

使用PHP我没有问题,HTML_Entity_Decode($mytext);可以很好地完成这项工作。

你能帮帮我吗?怎么啦?

根据需要,更多代码:在MySQL中的utf8_general_ci列“vtexte”

L’Automatisation des SystemÈ;MES dans le Monde

在symfony中的我的控件中:

namespace MU\CoreBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use MU\CoreBundle\Entity\Veille;

class CoreController extends Controller
{

public function actufreeAction()
{

  $repository = $this
    ->getDoctrine()
    ->getManager()
    ->getRepository('MUCoreBundle:Veille')
  ;

  $listactufree = $repository->findBy(
          array('vStatus' => '4'), // Critere
          array('vDatePublished' => 'desc'),        // Tri
          5,                              // Limite
          0                               // Offset
        );  



    $content = $this->get('templating')->render('MUCoreBundle::news.html.twig', array(
  'listactufree'  => $listactufree,
));
    return new Response($content);
}

}

在我的Twig文件news.html.Twig中

{% for veille in listactufree %}

    {{ veille.vTexte | raw }}

{% endfor %}

这样,它就显示了:

L’Automatisation des systemè;mes dans le monde

我想要:

世界系统自动化


共有1个答案

苗运珧
2023-03-14

您遇到的问题是最简单的形式的噩梦,即字符编码。处理编码问题的第一条规则是始终控制编码。在您的情况下,这个HTML实际上应该未编码地存储在DB中,允许使用twigraw输出过滤器。

如果您不知道HTML是否需要解码,请考虑其含义。例如,如果有人打算在文本中显示<(<),而html没有被编码,那么应用HTML_Entity_Decode将把编码的<转换为真实的,并中断html。(浏览器会认为您正在启动一个新标记)。

我猜在应用程序的其他地方,有允许用户提交HTML的表单。HTML表单在发布前对数据进行编码,PHP$_post处理通常自动将HTMLEntities应用到发布的字段上。

无论您的应用程序使用什么方法来处理这些发布的HTML的存储,或者添加/更改这些实体,都应该使用HTML_Entity_Decode来确保将其存储为原始HTML。

这样,您就会知道HTML存储在您的数据库中的状态正是它需要呈现在页面上的状态。如果由于某种原因需要在某个地方重新编码和解码,您就不会希望某些内容不会被双重解码。(或者就像您的情况一样,缺少解码步骤并输出原始HTML)。

您需要通过raw筛选器将这些内容放到您的twig中,使其处于需要放在页面上的确切状态。虽然这可以在twig中完成,或者使用twig函数完成,但这确实应该在控制器中完成。

请考虑此数据正在传输路径:

  1. 表单(原始HTML)
  2. PHP POST(编码的HTML)
  3. 数据库(编码的HTML)
  4. 选择查询
  5. PHP控制器(编码HTML)
  6. 小枝
  7. 呈现的HTML

越早能够获得处于正确状态的数据越好。这样做可以使数据更容易处理,降低性能影响,并防止在这些步骤的后面出现代码重复。(如果要在其他控制器或Twig模板中使用此html会发生什么?代码重复。)Hense,我的第一个建议是把它干净利落地放进数据库。

如果清理数据不是一个选项...

处理这个问题的另一个简单方法是在将html传递给Twig之前循环并解码html。但是,以这种方式执行,或者稍后在Tiwg模板中执行当前的操作,您将冒着我前面提到的双重解码的风险。

Class Veille
{

    . . .

    public static function decodeArray(?array $vielleList): ?array
    {
        foreach ($vielleList as $vielle) {
            if (!$vielle instanceof self) {
                continue;
            }

            $vielle->setVText(html_entity_decode($vielle->getVText()));
        }

        return $vielleList;
    }

    public function getVText(): ?string
    {
        return htmlentities("<h3>Encoded HTML Test</h3>Good data &gt; parsing bad data.");
    }

    public function setVText(?string $text): void
    {

    }
}
$listactufree = $repository->findBy(
    array('vStatus' => '4'), // Critere
    array('vDatePublished' => 'desc'),        // Tri
    5,                              // Limite
    0                               // Offset
);


$listactufree = Veille::decodeArray($listactufree);
{% for veille in listactufree %}

    {{ veille.vTexte|raw }}

{% endfor %}

decodearray方法的内容插入到一个命令中,并运行该命令以及persist/flush,将存储所有实体的解码HTML。只要确保您只解码一次,并且任何可以添加或编辑这些实体的方法都存储未编码的HTML。这才是关键。未编码的数据。

 类似资料:
  • 问题内容: 可以在Twig解码JSON吗?谷歌搜索似乎对此没有任何帮助。在Twig中解码JSON没有意义吗? 我正在尝试访问Symfony2的实体字段类型(Entity FieldType)上的2个实体属性。 实体类中的某处: 并采用以下形式: 之后,我希望在Twig … 问题答案: 如果您伸出Twig,那很容易。 首先,创建一个包含扩展名的类: 然后,在您的Services.xml文件中注册该类

  • 问题内容: 我需要解码HTML实体,例如来自&#246; 到ö和&amp; 至 &。 没有完成这项工作(从%表示法转换)。TextUtils具有HTMLencode,但没有HTMLdecode。 有解码HTML实体的功能吗? 问题答案: 该HTML的class是应该做的,但它是说,一切都没有支持。它总是对我有用,但是我从来没有过,所以我不能告诉你这个。尝试获取解码后的字符串。

  • 问题内容: 如何使用角度JS解码文本中的HTML实体。 我有绳子 我需要一种使用AngularJS对此进行解码的方法。我在这里找到了一种使用javascript做到这一点的方法,但是我敢肯定那对Angular无效。需要找回UI上的原始字符串 问题答案: 您可以使用 指令将其显示为html内容,并解码所有html实体。只要确保 在您的应用程序中包括依赖项即可。 演示 JAVASCRIPT HTML

  • 我正在升级一个扩展,以使用TYPO3 v10。由于命令控制器不能再使用,我将它们迁移到由留档指向的symfony命令。除了使用extbase存储库类之外,一切都非常顺利。无论我查询什么,我从来没有得到一个结果。因为我找不到任何有用的信息在网上和留档我希望这可能只是一些次要的。 调试一段时间后,我发现pid在构建查询设置时没有正确确定。我发现这种奇怪,因为我的根模板有这些行: injectMyRep

  • 问题内容: 我在任何地方都找不到此答案,但是可以从MySQL中的另一个存储过程调用存储过程吗?我想找回标识值,并在父存储过程中使用它。我们不能再使用FUNCTIONS! 问题答案: 参数应该可以帮助您将值返回给调用过程。基于此,解决方案必须是这样的。

  • 问题内容: 我正在从网站提取JSON文件,收到的字符串之一是: 如何将类似的内容转换为正确的字符? 我创建了一个Xcode Playground来演示它: 问题答案: 这个答案最近针对Swift 5.2和iOS 13.4 SDK进行了修订。 没有做到这一点的直接方法,但是您可以使用魔术使此过程尽可能轻松(请注意,此方法也将剥离所有HTML标记)。 记住 仅从主线程 初始化。它使用WebKit解析下