2016-04-13 3 views
5

Я генерируют сообщение с sprintf(), которое затем будет выводиться вместе с Symfony Console Component в цветном моде:Symfony консоль Вывод с маскирующим

$mask = '<info>%s</info>'; 
$message = sprintf($mask, 'MyString'); 
$output->writeln($message); 

Это обычно работает (выводит пространство имен в зеленый цвет). Однако, если строка заканчивается обратной косой черты закрывающая информация -tag игнорируется:

$message = sprintf($mask, 'MyString\'); 
$output->writeln($message); 

Выход:

MyString</info> 
     ^^^^^^^ 

Очевидно, что обратная косая черта, кажется, своего рода побег характер, но как избежать этого? Или как сохранить значение закрывающей метки </info>?

До сих пор я попытался с:

  • addcslashes('My\String\', '\\') - это продублировать внутри и одного FY в конце:

    My\\String\</info> 
    
  • &#92; в качестве объекта "HTML", последовательность HTML энтитя просто выводятся дословно и закрывающий тег отсутствует:

    My&#92;String&#92; 
    
+0

попробуйте установить Украсить к false на выходе как: '$ output-> setDecorated (false);' – Matteo

+0

, если вы можете использовать версию sf2.8, я предлагаю вам использовать компонент SymfonyStyle, как описано [здесь] (http://symfony.com/blog/new-in-symfony-2-8-console-style-guide) – Matteo

ответ

3

Символы < могут быть экранированы \, как вы уже догадались. И завершающие обратные косые можно избежать from Symfony 3.0.3, v2.8.3, v2.7.10 и v2.3.38 с OutputFormatter:

use Symfony\Component\Console\Formatter\OutputFormatter; 

$mask = '<info>%s</info>'; 
$message = sprintf($mask, OutputFormatter::escape('MyString\\')); 
$output->writeln($message); 

В противном случае вы можете использовать:

$mask = "\033[32m%s\033[0m"; 
$message = sprintf($mask, 'MyString\\'); 
$output->writeln($message); 
+0

Да, это он :) Большое спасибо! – hakre

Смежные вопросы