在标点符号之前解析要添加的TWIG字符串

时间:2016-07-18 10:45:28

标签: regex symfony twig

我搜索一种在TWIG中解析字符串的方法。

我有一个翻译文件:messages.fr.yml,我调用这样的字符串:{{ 'bloc.name'|trans() | raw }}

在法语中,在一些标点符号之前有一个空格。问题是当句子在标记之间被切断时。所以我想在这些标记之前替换每个空格:[ ? , ! , ; , : ]  

我虽然有一个可以使用autoescape +正则表达式的解决方案,但我不知道如何做到这一点,如果这是最好的方法。有人有想法吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您正在寻找:如何创建自己的Twig过滤器。

可以使用Twig Extension:http://symfony.com/doc/current/cookbook/templating/twig_extension.html

// src/AppBundle/Twig/AppExtension.php
namespace AppBundle\Twig;

class AppExtension extends \Twig_Extension
{
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('nbspace', array($this, 'nbspace'))
        );
    }

    public function nbspace($sentence)
    {
        return preg_replace('/ ([\?!;:])/',' $1',$sentence);
    }

    public function getName()
    {
        return 'app_extension';
    }
}

然后你必须在services.yml中启用这个过滤器,如下所示:

# app/config/services.yml
services:
    app.twig_extension:
        class: AppBundle\Twig\AppExtension
        public: false
        tags:
            - { name: twig.extension }

使用它:

{{ 'bloc.name'|trans() | nbspace | raw }}

无需在用例中更改autoescaping stategy。

如果你想避免原始'过滤器,您还可以指定您的过滤器返回“html'安全”的内容。 :

new \Twig_SimpleFilter('nbspace', array($this, 'nbspace'), array('is_safe'=>array('html')))