読者です 読者をやめる 読者になる 読者になる

HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

文字列リテラルのいろいろ

PHPの文字列リテラルはダブルクォートで括ったりシングルクォートで括ったり、またそれらの扱い方が違うなど、いろいろとややこしいので、とりあえずいろんなパターンを作ってみた。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<table border="1">
<?php
    $strs_array = array(
        array(
            "label" => "ダブルクォート - 単一文字(構文エラーになるもの('\"'と'\\')は空白に置換)",
            "data" => array(
                " ", "!", " ", "#", "$", "%", "&", "'", "(", ")", "*", "+",
                ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7",
                "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C",
                "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O",
                "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[",
                " ", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g",
                "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
                "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~",
            ),
        ),
        array(
            "label" => "シングルクォート - 単一文字(構文エラーになるもの(\"'\"と'\\')は空白に置換)",
            "data" => array(
                ' ', '!', '"', '#', '$', '%', '&', ' ', '(', ')', '*', '+',
                ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
                '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C',
                'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
                'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[',
                ' ', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
                'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
                't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
            ),
        ),

        array(
            "label" => "ダブルクォート - '\\'でエスケープ(のつもり(謎))",
            "data" => array(
                "\ ", "\!", "\"", "\#", "\$", "\%", "\&", "\'", "\(", "\)", "\*", "\+",
                "\,", "\-", "\.", "\/", "\0", "\1", "\2", "\3", "\4", "\5", "\6", "\7",
                "\8", "\9", "\:", "\;", "\<", "\=", "\>", "\?", "\@", "\A", "\B", "\C",
                "\D", "\E", "\F", "\G", "\H", "\I", "\J", "\K", "\L", "\M", "\N", "\O",
                "\P", "\Q", "\R", "\S", "\T", "\U", "\V", "\W", "\X", "\Y", "\Z", "\[",
                "\\", "\]", "\^", "\_", "\`", "\a", "\b", "\c", "\d", "\e", "\f", "\g",
                "\h", "\i", "\j", "\k", "\l", "\m", "\n", "\o", "\p", "\q", "\r", "\s",
                "\t", "\u", "\v", "\w", "\x", "\y", "\z", "\{", "\|", "\}", "\~",
            ),
        ),
        array(
            "label" => "シングルクォート - '\\'でエスケープ(のつもり(謎))",
            "data" => array(
                '\ ', '\!', '\"', '\#', '\$', '\%', '\&', '\'', '\(', '\)', '\*', '\+',
                '\,', '\-', '\.', '\/', '\0', '\1', '\2', '\3', '\4', '\5', '\6', '\7',
                '\8', '\9', '\:', '\;', '\<', '\=', '\>', '\?', '\@', '\A', '\B', '\C',
                '\D', '\E', '\F', '\G', '\H', '\I', '\J', '\K', '\L', '\M', '\N', '\O',
                '\P', '\Q', '\R', '\S', '\T', '\U', '\V', '\W', '\X', '\Y', '\Z', '\[',
                '\\', '\]', '\^', '\_', '\`', '\a', '\b', '\c', '\d', '\e', '\f', '\g',
                '\h', '\i', '\j', '\k', '\l', '\m', '\n', '\o', '\p', '\q', '\r', '\s',
                '\t', '\u', '\v', '\w', '\x', '\y', '\z', '\{', '\|', '\}', '\~',
            ),
        ),

        array(
            "label" => "ダブルクォート - 後ろに英字が続くと‥",
            "data" => array(
                " ab", "!ab", " ab", "#ab", "$ab", "%ab", "&ab", "'ab", "(ab", ")ab", "*ab", "+ab",
                ",ab", "-ab", ".ab", "/ab", "0ab", "1ab", "2ab", "3ab", "4ab", "5ab", "6ab", "7ab",
                "8ab", "9ab", ":ab", ";ab", "<ab", "=ab", ">ab", "?ab", "@ab", "Aab", "Bab", "Cab",
                "Dab", "Eab", "Fab", "Gab", "Hab", "Iab", "Jab", "Kab", "Lab", "Mab", "Nab", "Oab",
                "Pab", "Qab", "Rab", "Sab", "Tab", "Uab", "Vab", "Wab", "Xab", "Yab", "Zab", "[ab",
                "\ab", "]ab", "^ab", "_ab", "`ab", "aab", "bab", "cab", "dab", "eab", "fab", "gab",
                "hab", "iab", "jab", "kab", "lab", "mab", "nab", "oab", "pab", "qab", "rab", "sab",
                "tab", "uab", "vab", "wab", "xab", "yab", "zab", "{ab", "|ab", "}ab", "~ab",
            ),
        ),
        array(
            "label" => "シングルクォート - 後ろに英字が続くと‥",
            "data" => array(
                ' ab', '!ab', '"ab', '#ab', '$ab', '%ab', '&ab', ' ab', '(ab', ')ab', '*ab', '+ab',
                ',ab', '-ab', '.ab', '/ab', '0ab', '1ab', '2ab', '3ab', '4ab', '5ab', '6ab', '7ab',
                '8ab', '9ab', ':ab', ';ab', '<ab', '=ab', '>ab', '?ab', '@ab', 'Aab', 'Bab', 'Cab',
                'Dab', 'Eab', 'Fab', 'Gab', 'Hab', 'Iab', 'Jab', 'Kab', 'Lab', 'Mab', 'Nab', 'Oab',
                'Pab', 'Qab', 'Rab', 'Sab', 'Tab', 'Uab', 'Vab', 'Wab', 'Xab', 'Yab', 'Zab', '[ab',
                '\ab', ']ab', '^ab', '_ab', '`ab', 'aab', 'bab', 'cab', 'dab', 'eab', 'fab', 'gab',
                'hab', 'iab', 'jab', 'kab', 'lab', 'mab', 'nab', 'oab', 'pab', 'qab', 'rab', 'sab',
                'tab', 'uab', 'vab', 'wab', 'xab', 'yab', 'zab', '{ab', '|ab', '}ab', '~ab',
            ),
        ),

        array(
            "label" => "ダブルクォート - 教科書に載っているエスケープシーケンス",
            "data" => array(
                "\r", "\n", "\t", "\v", "\f", "\$", "\\", "\"",
                "\41",   // '!'の8進表記
                "\x21",  // '!'の16進表記
                "\'",
            ),
        ),
        array(
            "label" => "シングルクォート - 教科書に載っているエスケープシーケンス",
            "data" => array(
                '\r', '\n', '\t', '\v', '\f', '\$', '\\', '\"',
                '\41',   // '!'の8進表記
                '\x21',  // '!'の16進表記
                '\'',
            ),
        ),

        array(
            "label" => "ダブルクォート - 変数に関わる表記",
            "data" => array(
                "$ab", "{$ab}", "${ab}",     // 変数参照として許される表記
                "\{$ab}", "$\{ab}",      // 中括弧('{')をエスケープ(?)してみる
                "\$ab", "{\$ab}", "\${ab}",  // ドル記号('$')をエスケープしてみる
            ),
        ),
        array(
            "label" => "シングルクォート - 変数に関わる表記",
            "data" => array(
                '$ab', '{$ab}', '${ab}',     // 変数参照として許される表記
                '\{$ab}', '$\{ab}',      // 中括弧('{')をエスケープ(?)してみる
                '\$ab', '{\$ab}', '\${ab}',  // ドル記号('$')をエスケープしてみる
            ),
        ),
    );

    $ncols = 12;
    foreach ($strs_array as $idx => $strs) {
?>
    <tr>
        <th colspan="<?php echo $ncols; ?>">
            <?php print("(".(${idx}+1).") ".$strs['label']); ?>
        </th>
<?php
        $i = 0;
        foreach ($strs['data'] as $str) {
            if ($i % $ncols == 0) {
?>

    </tr><tr>
<?php
            }

            print("\t\t".'<td width="50">');
            print('<code>'.htmlentities($str).'</code>');
            print(' (<span>'.strlen($str).'</span>)');
            print('</td>'."\n");

            ++$i;
        }
?>
    </tr><tr>
        <td colspan="<?php echo $ncols; ?>"></td>
    </tr>
<?php
    }
?>
</table>
</body>
</html>

2010-0909-strings.php 直
で、Firefoxで表示した結果は次のとおり。

単一文字(構文エラーになるものは空白に置換)


次のものに注意する程度で、他は特に問題はないかと。

  • ダブルクォート:
    • ダブルクォート(上から1番目、左から3番目)
    • バックスラッシュ(上6左1)
  • シングルクォート:
    • シングルクォート(上1左8)
    • バックスラッシュ(上6左1)

'\\'でエスケープ(のつもり(謎))

  • ダブルクォート:
    • ダブルクォート(上1左3)
    • ドル記号(上1左5)
      • 変数展開と関係する
    • 0,1,2,3,4,5,6,7 (上2左5〜12)
      • 8進表記とみなされる
    • バックスラッシュ(上6左1)
    • f (上6左11)
      • エスケープシーケンス
    • n (上7左7)
      • エスケープシーケンス
    • r (上7左11)
      • エスケープシーケンス
    • t (上8左1)
      • エスケープシーケンス
    • v (上8左3)
      • エスケープシーケンス
  • シングルクォート:
    • シングルクォート(上1左8)
    • バックスラッシュ(上6左1)

後ろに英字が続くと‥

  • ダブルクォート:
    • ダブルクォート(上1左3)
    • ドル記号(上1左5)
      • 変数とみなされ、展開される(変数の値を定義していないので空文字列)
  • シングルクォート:
    • シングルクォート(上1左8)

教科書に載っているエスケープシーケンス

  • ダブルクォート:
    • シングルクォートだけはエスケープシーケンスとみなされない
  • シングルクォート:
    • バックスラッシュとシングルクォート以外はすべてそのまま

変数に関わる表記

  • ダブルクォート:
    • 変数展開されるが、ドル記号をエスケープすればそのまま扱われる
  • シングルクォート:
    • 変数展開はまったくされない


いろいろとめんどくさい‥