2016-04-13 32 views
5

sto generando un messaggio con sprintf() che viene poi di essere uscita con il Symfony Console Component in maniera colorata:uscita Symfony Console con carattere di escape

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

Questo funziona in generale (uscite lo spazio dei nomi in verde). Tuttavia, se la stringa termina con una barra rovesciata , la chiusura informazioni -tag viene ignorato:

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

uscita:

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

Ovviamente il backslash sembra essere una sorta di carattere di escape, ma come sfuggirlo? O come preservare il significato del tag di chiusura </info>?

Finora ho provato con:

  • addcslashes('My\String\', '\\') - fa duplicati all'interno e single-fy alla fine:

    My\\String\</info> 
    
  • &#92; come entità "HTML", la sequenza di entità HTML è solo output verbatim e il tag di chiusura è scomparso:

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

provare l'impostazione decorare a false sull'output come: '$ output-> setDecorated (false);' – Matteo

+0

se puoi usare la versione sf2.8 ti suggerisco di usare il componente SymfonyStyle come descritto [qui] (http://symfony.com/blog/new-in-symfony-2-8-console-style-guide) – Matteo

risposta

3

Il carattere < può essere preceduto da uno \ come già indovinato. E i backslash scorrevole può essere sfuggito from Symfony v3.0.3, v2.8.3, v2.7.10 e v2.3.38 con OutputFormatter:

use Symfony\Component\Console\Formatter\OutputFormatter; 

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

In caso contrario è possibile utilizzare:

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

Sì, è tutto :) Grazie mille! – hakre