2016-04-13 20 views
5

ich eine Nachricht mit sprintf() erzeugen, die dann mit dem Ausgang Symfony Console Component in einem farbigen Mode zu sein ist:Symfony Konsolenausgabe mit Escape-Zeichen

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

Dies funktioniert im Allgemeinen (gibt den Namespace in grün). Allerdings, wenn die Zeichenfolge endet mit einem Backslash, das Schließen Info -tag ignoriert:

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

Ausgang:

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

Offensichtlich ist der Backslash eine Art Escape-Zeichen zu sein scheint, aber Wie kann man dem entkommen? Oder wie man die Bedeutung des schließenden Tags </info> bewahrt?

Bisher habe ich versucht, mit:

  • addcslashes('My\String\', '\\') - innen dupliziert und Single-fy am Ende:

    My\\String\</info> 
    
  • &#92; als "HTML" Einheit, die HTML-Entity-Sequenz ist nur wörtlich ausgeben und das schließende Tag ist weg:

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

versuchen, die Einstellung zu verzieren false auf der Ausgabe als: '$ output-> setDecorated (false);' – Matteo

+0

Wenn Sie die Version sf2.8 verwenden können, empfehle ich Ihnen, die SymfonyStyle-Komponente wie beschrieben [hier] (http://symfony.com/blog) zu verwenden/new-in-symfony-2-8-konsole-style-guide) – Matteo

Antwort

3

Das < Zeichen kann durch eine \ wie Sie bereits erraten haben, entgangen werden. Und die hinteren Schrägstriche können from Symfony v3.0.3, v2.8.3, v2.7.10 und v2.3.38 mit OutputFormatter entwertet werden:

use Symfony\Component\Console\Formatter\OutputFormatter; 

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

Ansonsten können Sie verwenden:

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

Ja, das ist es :) Vielen Dank! – hakre