xref: /plugin/combo/vendor/symfony/yaml/Escaper.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeau/*
4*04fd306cSNickeau * This file is part of the Symfony package.
5*04fd306cSNickeau *
6*04fd306cSNickeau * (c) Fabien Potencier <fabien@symfony.com>
7*04fd306cSNickeau *
8*04fd306cSNickeau * For the full copyright and license information, please view the LICENSE
9*04fd306cSNickeau * file that was distributed with this source code.
10*04fd306cSNickeau */
11*04fd306cSNickeau
12*04fd306cSNickeaunamespace Symfony\Component\Yaml;
13*04fd306cSNickeau
14*04fd306cSNickeau/**
15*04fd306cSNickeau * Escaper encapsulates escaping rules for single and double-quoted
16*04fd306cSNickeau * YAML strings.
17*04fd306cSNickeau *
18*04fd306cSNickeau * @author Matthew Lewinski <matthew@lewinski.org>
19*04fd306cSNickeau *
20*04fd306cSNickeau * @internal
21*04fd306cSNickeau */
22*04fd306cSNickeauclass Escaper
23*04fd306cSNickeau{
24*04fd306cSNickeau    // Characters that would cause a dumped string to require double quoting.
25*04fd306cSNickeau    public const REGEX_CHARACTER_TO_ESCAPE = "[\\x00-\\x1f]|\x7f|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9";
26*04fd306cSNickeau
27*04fd306cSNickeau    // Mapping arrays for escaping a double quoted string. The backslash is
28*04fd306cSNickeau    // first to ensure proper escaping because str_replace operates iteratively
29*04fd306cSNickeau    // on the input arrays. This ordering of the characters avoids the use of strtr,
30*04fd306cSNickeau    // which performs more slowly.
31*04fd306cSNickeau    private const ESCAPEES = ['\\', '\\\\', '\\"', '"',
32*04fd306cSNickeau                                     "\x00",  "\x01",  "\x02",  "\x03",  "\x04",  "\x05",  "\x06",  "\x07",
33*04fd306cSNickeau                                     "\x08",  "\x09",  "\x0a",  "\x0b",  "\x0c",  "\x0d",  "\x0e",  "\x0f",
34*04fd306cSNickeau                                     "\x10",  "\x11",  "\x12",  "\x13",  "\x14",  "\x15",  "\x16",  "\x17",
35*04fd306cSNickeau                                     "\x18",  "\x19",  "\x1a",  "\x1b",  "\x1c",  "\x1d",  "\x1e",  "\x1f",
36*04fd306cSNickeau                                     "\x7f",
37*04fd306cSNickeau                                     "\xc2\x85", "\xc2\xa0", "\xe2\x80\xa8", "\xe2\x80\xa9",
38*04fd306cSNickeau                               ];
39*04fd306cSNickeau    private const ESCAPED = ['\\\\', '\\"', '\\\\', '\\"',
40*04fd306cSNickeau                                     '\\0',   '\\x01', '\\x02', '\\x03', '\\x04', '\\x05', '\\x06', '\\a',
41*04fd306cSNickeau                                     '\\b',   '\\t',   '\\n',   '\\v',   '\\f',   '\\r',   '\\x0e', '\\x0f',
42*04fd306cSNickeau                                     '\\x10', '\\x11', '\\x12', '\\x13', '\\x14', '\\x15', '\\x16', '\\x17',
43*04fd306cSNickeau                                     '\\x18', '\\x19', '\\x1a', '\\e',   '\\x1c', '\\x1d', '\\x1e', '\\x1f',
44*04fd306cSNickeau                                     '\\x7f',
45*04fd306cSNickeau                                     '\\N', '\\_', '\\L', '\\P',
46*04fd306cSNickeau                              ];
47*04fd306cSNickeau
48*04fd306cSNickeau    /**
49*04fd306cSNickeau     * Determines if a PHP value would require double quoting in YAML.
50*04fd306cSNickeau     *
51*04fd306cSNickeau     * @param string $value A PHP value
52*04fd306cSNickeau     */
53*04fd306cSNickeau    public static function requiresDoubleQuoting(string $value): bool
54*04fd306cSNickeau    {
55*04fd306cSNickeau        return 0 < preg_match('/'.self::REGEX_CHARACTER_TO_ESCAPE.'/u', $value);
56*04fd306cSNickeau    }
57*04fd306cSNickeau
58*04fd306cSNickeau    /**
59*04fd306cSNickeau     * Escapes and surrounds a PHP value with double quotes.
60*04fd306cSNickeau     *
61*04fd306cSNickeau     * @param string $value A PHP value
62*04fd306cSNickeau     */
63*04fd306cSNickeau    public static function escapeWithDoubleQuotes(string $value): string
64*04fd306cSNickeau    {
65*04fd306cSNickeau        return sprintf('"%s"', str_replace(self::ESCAPEES, self::ESCAPED, $value));
66*04fd306cSNickeau    }
67*04fd306cSNickeau
68*04fd306cSNickeau    /**
69*04fd306cSNickeau     * Determines if a PHP value would require single quoting in YAML.
70*04fd306cSNickeau     *
71*04fd306cSNickeau     * @param string $value A PHP value
72*04fd306cSNickeau     */
73*04fd306cSNickeau    public static function requiresSingleQuoting(string $value): bool
74*04fd306cSNickeau    {
75*04fd306cSNickeau        // Determines if a PHP value is entirely composed of a value that would
76*04fd306cSNickeau        // require single quoting in YAML.
77*04fd306cSNickeau        if (\in_array(strtolower($value), ['null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off'])) {
78*04fd306cSNickeau            return true;
79*04fd306cSNickeau        }
80*04fd306cSNickeau
81*04fd306cSNickeau        // Determines if the PHP value contains any single characters that would
82*04fd306cSNickeau        // cause it to require single quoting in YAML.
83*04fd306cSNickeau        return 0 < preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` \p{Zs}]/xu', $value);
84*04fd306cSNickeau    }
85*04fd306cSNickeau
86*04fd306cSNickeau    /**
87*04fd306cSNickeau     * Escapes and surrounds a PHP value with single quotes.
88*04fd306cSNickeau     *
89*04fd306cSNickeau     * @param string $value A PHP value
90*04fd306cSNickeau     */
91*04fd306cSNickeau    public static function escapeWithSingleQuotes(string $value): string
92*04fd306cSNickeau    {
93*04fd306cSNickeau        return sprintf("'%s'", str_replace('\'', '\'\'', $value));
94*04fd306cSNickeau    }
95*04fd306cSNickeau}
96