【问题标题】:TWIG: capitalize makes other letters smallTWIG:大写使其他字母变小
【发布时间】:2015-09-20 21:23:19
【问题描述】:

我有一个包含此内容的变量"i want HTML"

当我创建capitalize {{ variable|capitalize }} 时,这句话是:"I want html"

如何在 TWIG 中只写大句子的第一个字母而其他人保持原样!?

【问题讨论】:

    标签: symfony twig capitalization


    【解决方案1】:

    你可以这样做:

    {{ variable[:1]|upper ~ variable[1:] }}
    

    来自https://github.com/twigphp/Twig/issues/1652

    【讨论】:

      【解决方案2】:

      你可以create a new filter使用php函数ucfirst返回你的字符串。

      【讨论】:

      【解决方案3】:

      为了说明一个好的 Twig 练习解决方案,您可以创建一个自定义 Utilities Twig Extension 并考虑使用多字节字符串 (mb) 来处理以重音开头的字符串,以使其正常工作:

      use Twig_SimpleFilter;
      
      class UtilitiesExtension extends \Twig_Extension
      {
          public function getFilters()
          {
              return array(
                  new Twig_SimpleFilter('ucfirst', 
                      array($this, 'ucFirst'), array('needs_environment' => true)
                  ),
              );
          }
      
          public function ucFirst(Twig_Environment $env, $string)
          {
              if (null !== $charset = $env->getCharset()) {
                  $prefix = mb_strtoupper(mb_substr($string, 0, 1, $charset), $charset);
                  $suffix = mb_substr($string, 1, mb_strlen($string, $charset));
                  return sprintf('%s%s', $prefix, $suffix); 
              }
              return ucfirst(strtolower($string));
          }
      }
      

      然后您可以顺便从树枝文件中调用此类过滤器。口音甚至可以工作:

      {{ 'étudiant de PHP' | ucfirst }}
      

      结果:“Étudiant de PHP”

      【讨论】:

        【解决方案4】:

        ucfirst 可以,但不能正确处理重音。所以我的ucfirst 过滤器看起来像这样:

        /**
         * ucfirst with handling of accents.
         *
         * @param string $value
         * @param string $encoding
         *
         * @return string
         */
        public function ucfirst($value, $encoding = 'UTF8')
        {
            $strlen = mb_strlen($value, $encoding);
            $firstChar = mb_substr($value, 0, 1, $encoding);
            $then = mb_substr($value, 1, $strlen - 1, $encoding);
        
            return mb_strtoupper($firstChar, $encoding) . $then;
        }
        

        -

        $test1 = $this->container->get('app.twig.text.extension')->ucfirst('i want HTML');
        $test2 = $this->container->get('app.twig.text.extension')->ucfirst('éllo');
        dump($test1, $test2); die();
        

        将输出:

        "I want HTML"
        "Éllo"
        

        ucfirst一样会输出:

        "I want HTML"
        "éllo"
        

        【讨论】:

        • 还可以实现 needs_environment 以使用全局 env 编码
        【解决方案5】:

        您可以非常轻松地为ucfirst() 创建过滤器:

        //in PHP - during setup
        $twig->addFilter(new \Twig_SimpleFilter('ucfirst', 'ucfirst'));
        
        //in Twig usage
        {% set variable = 'i want html' %}
        {{ variable|ucfirst }} //output: "I want html"
        

        如果您打算在“HTML”上使用strtoupper(),您可以创建一个过滤器

        【讨论】:

        • 这不会产生所需的输出。
        • @tremby 已更正,我误读了这个问题。感谢您指出我的错误。
        【解决方案6】:

        你应该选择句子的第一个单词并且只大写它:

        {% set foo = "i want HTML" | split(' ', 2) %}
        {{ foo[0] | capitalize }} {{ foo[1] }}{% set foo = "i want HTML" | split(' ', 2) %}
        {{ foo[0] | capitalize }} {{ foo[1] }}
        

        希望对您有所帮助!在此处查看示例:link

        【讨论】:

        • 我有一个类似“返回 HTML”的句子,你的建议的输出是“返回”。其他词被淘汰了
        • 好的,抱歉,您应该附加剩余的字符串。试试这个方法: {% set foo = "I want html" | split(' ', 2) %} {{ foo[0] |大写 }} {{ foo[1] }}
        • 问题是它不能只用一个词。所以有一个错误,因为键“1”不存在。我认为它在树枝上太复杂了,只用大写写第一个字母
        • 你最好只做更多的工作并编写一个过滤树枝扩展来做到这一点 - 特别是如果你打算在多个场合使用它
        • mmh...这很奇怪...我试过这个:{% set foo = "i want HTML" | split(' ', 2) %} {{ foo[0] |大写 }} {{ foo[1] }} 并且它可以工作,请参阅jsfiddle.net/fzNNT/18
        【解决方案7】:

        Twig_SimpleFilter 已弃用。我创建了一个工作解决方案,它使用当前的Twig_Filter 并处理重音(取自 COil 代码)。该示例在独立应用程序中演示了 Twig 自定义过滤器。

        <?php
        
        require __DIR__ . '/vendor/autoload.php';
        
        use Twig\Environment;
        use Twig\Loader\FilesystemLoader;
        
        $loader = new FilesystemLoader(__DIR__ . '/templates');
        $twig = new Environment($loader);
        $twig->addFilter(new Twig_Filter('accFirst', 'accFirst'));
        
        $sentence = 'šumivé víno';
        
        echo $twig->render('customfilter.html.twig',
            ['sentence' => $sentence]);
        
        function accFirst($value, $encoding = 'UTF8')
        {
            $strlen = mb_strlen($value, $encoding);
            $firstChar = mb_substr($value, 0, 1, $encoding);
            $rest = mb_substr($value, 1, $strlen - 1, $encoding);
        
            return mb_strtoupper($firstChar, $encoding) . $rest;
        }
        

        以下是模板文件。模板文件位于templates目录下。

        <!DOCTYPE html>
        <html lang="en">
        
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>Custom filter</title>
        </head>
        
        <body>  
        
            <p>
             {{ sentence | accFirst }} 
            </p>      
        
        </body>
        
        </html>
        

        【讨论】:

          【解决方案8】:

          使用本机代码的简单解决方案是:

          {{ variable|first|capitalize ~ variable|slice(1) }}
          

          【讨论】:

            【解决方案9】:

            以下解决方案适用于任何短语,但它只会修复“HTML”一词,而不是其他可能需要修复的首字母缩略词:

            {{ variable|capitalize|replace({ 'html': 'HTML' }) }}
            

            【讨论】:

            • 不,这行不通:字符串的其余部分应保持原样,但capitalize 会将所有内容都小写
            猜你喜欢
            • 1970-01-01
            • 2011-08-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-23
            • 2013-11-29
            相关资源
            最近更新 更多