TWIG:大写使其他字母变小

时间:2015-07-03 06:26:41

标签: symfony twig capitalization

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

当我capitalize {{ variable|capitalize }}时,句子为:"I want html"

我怎样才能只写出TWIG中句子的第一个字母,其他字母就像它们一样!?

9 个答案:

答案 0 :(得分:19)

你可以这样做:

[phases]
publish = False

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

答案 1 :(得分:9)

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

答案 2 :(得分:5)

为了说明一个好的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));
    }
}

然后你可以通过twig文件调用这样的过滤器。口音甚至有效:

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

结果:“ÉtudiantdePHP”

答案 3 :(得分:3)

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"

答案 4 :(得分:1)

您应该选择句子的第一个单词并仅将其大写:

{% 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

答案 5 :(得分:1)

您可以非常轻松地为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(),则可以创建过滤器

答案 6 :(得分:0)

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>

答案 7 :(得分:0)

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

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

答案 8 :(得分:-1)

以下解决方案适用于任何短语,但它只会修复&#34; HTML&#34;字而不是其他可能需要修复的缩略语:

Class provideClass = Class.forName( "com.sun.xml.internal.ws.spi.ProviderImpl");
provider = (Provider) provideClass.newInstance();
ServiceDelegate delegate = provider.createServiceDelegate( urlWsdl, new QName( namespaceURI, serviceName ), (Class<? extends Service>) bindClass );
QName qName = new QName( namespaceURI, portName );
WebServicesPT port;
port = ( WebServicesPT ) delegate.getPort( qName, bindClass );