Symfony 小树枝:大写使其他字母变小

Symfony 小树枝:大写使其他字母变小,symfony,twig,capitalization,Symfony,Twig,Capitalization,我有一个包含此内容的变量“我想要HTML” 当我使大写{{variable | capitalize}}时,句子是:“我想要html” 我怎么能只写大树枝句子的第一个字母,而其他字母保持不变 你应该选择句子的第一个单词,只将其大写: {% set foo = "i want HTML" | split(' ', 2) %} {{ foo[0] | capitalize }} {{ foo[1] }}{% set foo = "i want HTML" | split(' ', 2) %} {{

我有一个包含此内容的变量
“我想要HTML”

当我使
大写
{{variable | capitalize}}
时,句子是:
“我想要html”


我怎么能只写大树枝句子的第一个字母,而其他字母保持不变

你应该选择句子的第一个单词,只将其大写:

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

希望对大家有所帮助!请参见此处的示例:

您可以使用php函数
ucfirst
返回字符串。以下解决方案适用于任何短语,但它只修复“HTML”单词,而不修复其他可能需要修复的首字母缩略词:

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

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;
}
-

将输出:

"I want HTML"
"Éllo"
"I want HTML"
"éllo"
ucfirst相同的将输出:

"I want HTML"
"Éllo"
"I want HTML"
"éllo"
您可以这样做:

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

< P>只是为了说明一个好的TWIG实践解决方案,您可以创建一个自定义实用程序TWG扩展,并考虑Multibyte String(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 }}

结果是:“etudiant de PHP”

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


如果您打算在“HTML”上使用
strtoupper()
Twig\u SimpleFilter
已弃用,则可以创建筛选器。我已经创建了一个工作解决方案,它使用当前的
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;
}

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

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

当我有一个像“返回HTML”这样的句子时,你建议的输出是“返回”。其他单词是eleminatedOk,对不起,您应该附加剩余的字符串。试着这样做:{%set foo=“I want html”| split(“”,2)%}{{{foo[0]| capitalize}}{{foo[1]}问题是它不能只使用一个单词。因此出现了一个错误,因为键“1”不存在。我认为twig太复杂了,不能只用大写字母写第一个字母。你最好多做一点工作,并编写一个过滤器twig扩展来做到这一点——特别是如果你计划在多个场合使用它的话。。。这很奇怪。。。我尝试过:{%set foo=“I want HTML”{foo[0]| capitalize}{{foo[1]}它可以工作,请看,我创建了一个自己的扩展,如图所示:肯定是一条路要走,尽管我以前在
ucfirst
上遇到了一些问题(没有工作,最终放弃了)还可以实现需要_环境与全局环境编码一起工作这不会产生所需的输出。@tremby更正,我误解了问题。谢谢你指出我的错误。不,那不行:字符串的其余部分应该保持给定的状态,但是
大写
将所有内容都小写
{{ variable|first|capitalize ~ variable|slice(1) }}