2015-08-17 17:00:26 -07:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\Yaml ;
/**
* Escaper encapsulates escaping rules for single and double - quoted
* YAML strings .
*
* @ author Matthew Lewinski < matthew @ lewinski . org >
2016-04-20 09:56:34 -07:00
*
* @ internal
2015-08-17 17:00:26 -07:00
*/
class Escaper
{
// Characters that would cause a dumped string to require double quoting.
const REGEX_CHARACTER_TO_ESCAPE = " [ \\ x00- \\ x1f]| \xc2 \x85 | \xc2 \xa0 | \xe2 \x80 \xa8 | \xe2 \x80 \xa9 " ;
// Mapping arrays for escaping a double quoted string. The backslash is
// first to ensure proper escaping because str_replace operates iteratively
// on the input arrays. This ordering of the characters avoids the use of strtr,
// which performs more slowly.
private static $escapees = array ( '\\' , '\\\\' , '\\"' , '"' ,
" \x00 " , " \x01 " , " \x02 " , " \x03 " , " \x04 " , " \x05 " , " \x06 " , " \x07 " ,
" \x08 " , " \x09 " , " \x0a " , " \x0b " , " \x0c " , " \x0d " , " \x0e " , " \x0f " ,
" \x10 " , " \x11 " , " \x12 " , " \x13 " , " \x14 " , " \x15 " , " \x16 " , " \x17 " ,
" \x18 " , " \x19 " , " \x1a " , " \x1b " , " \x1c " , " \x1d " , " \x1e " , " \x1f " ,
2017-07-03 16:47:07 +01:00
" \xc2 \x85 " , " \xc2 \xa0 " , " \xe2 \x80 \xa8 " , " \xe2 \x80 \xa9 " ,
);
2015-08-17 17:00:26 -07:00
private static $escaped = array ( '\\\\' , '\\"' , '\\\\' , '\\"' ,
'\\0' , '\\x01' , '\\x02' , '\\x03' , '\\x04' , '\\x05' , '\\x06' , '\\a' ,
'\\b' , '\\t' , '\\n' , '\\v' , '\\f' , '\\r' , '\\x0e' , '\\x0f' ,
'\\x10' , '\\x11' , '\\x12' , '\\x13' , '\\x14' , '\\x15' , '\\x16' , '\\x17' ,
'\\x18' , '\\x19' , '\\x1a' , '\\e' , '\\x1c' , '\\x1d' , '\\x1e' , '\\x1f' ,
2017-07-03 16:47:07 +01:00
'\\N' , '\\_' , '\\L' , '\\P' ,
);
2015-08-17 17:00:26 -07:00
/**
* Determines if a PHP value would require double quoting in YAML .
*
* @ param string $value A PHP value
*
2017-02-02 16:28:38 -08:00
* @ return bool True if the value would require double quotes
2015-08-17 17:00:26 -07:00
*/
public static function requiresDoubleQuoting ( $value )
{
2017-07-03 16:47:07 +01:00
return 0 < preg_match ( '/' . self :: REGEX_CHARACTER_TO_ESCAPE . '/u' , $value );
2015-08-17 17:00:26 -07:00
}
/**
* Escapes and surrounds a PHP value with double quotes .
*
* @ param string $value A PHP value
*
* @ return string The quoted , escaped string
*/
public static function escapeWithDoubleQuotes ( $value )
{
return sprintf ( '"%s"' , str_replace ( self :: $escapees , self :: $escaped , $value ));
}
/**
* Determines if a PHP value would require single quoting in YAML .
*
* @ param string $value A PHP value
*
2017-02-02 16:28:38 -08:00
* @ return bool True if the value would require single quotes
2015-08-17 17:00:26 -07:00
*/
public static function requiresSingleQuoting ( $value )
{
// Determines if a PHP value is entirely composed of a value that would
// require single quoting in YAML.
2018-11-23 12:29:20 +00:00
if ( \in_array ( strtolower ( $value ), array ( 'null' , '~' , 'true' , 'false' , 'y' , 'n' , 'yes' , 'no' , 'on' , 'off' ))) {
2015-08-17 17:00:26 -07:00
return true ;
}
// Determines if the PHP value contains any single characters that would
// cause it to require single quoting in YAML.
2017-07-03 16:47:07 +01:00
return 0 < preg_match ( '/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` ]/x' , $value );
2015-08-17 17:00:26 -07:00
}
/**
* Escapes and surrounds a PHP value with single quotes .
*
* @ param string $value A PHP value
*
* @ return string The quoted , escaped string
*/
public static function escapeWithSingleQuotes ( $value )
{
return sprintf ( " '%s' " , str_replace ( '\'' , '\'\'' , $value ));
}
}