TWIG: capitalize делает другие буквы маленькими

у меня есть переменная с таким содержанием "i want HTML"

когда я делаю capitalize {{ variable|capitalize }} приговор: "I want html"

как я могу написать только первую букву предложения big in TWIG, а остальные остаются такими, какие они есть!?

7 ответов


вы можете создать новый фильтр которые возвращают вашу строку с помощью функции php ucfirst.


вы можете просто сделать это:

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

от https://github.com/twigphp/Twig/issues/1652


чтобы проиллюстрировать хорошее решение для практики веточек, вы можете создать Пользовательское расширение Twig Utilities и рассмотреть Многобайтовую строку (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 }}

результаты в: "Étudiant de PHP"


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"

вы должны выбрать первое слово предложения и просто заглавными буквами:

{% set foo = "i want HTML" | split(' ', 2) %}
{{ foo[0] | capitalize }} {{ foo[1] }}{% set foo = "i want HTML" | split(' ', 2) %}
{{ foo[0] | capitalize }} {{ foo[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"

вы можете создать фильтр, если вы собираетесь использовать strtoupper() на "HTML"


следующее решение будет работать для любой фразы, но оно будет исправлять только слово "HTML", а не другие аббревиатуры, которые также могут быть исправлены:

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