0

我有一个包含字符串的变量,我不知道字符串可能是什么,但它可能包含特殊字符。

我想“按原样”将其输出到文本文件中。因此,例如,如果有一个字符串“我的字符串\n”,我希望文本文件准确地显示它,而不是将 \n 解释为换行符/换行符。

4

2 回答 2

1

然后确保它在字符串中是“原样”,例如"my string \\n"or 'my string \n'。PHP 不会对实际数据进行任何转换 -PHP 解析代码中的字符串文字"\n"时,会发生对换行符的转换。

现在,假设您希望将数据/字符串中的实际换行符( "\n") 写入为两个字符( '\n') 的序列,则必须将其转换回来,例如:

# \n is converted to a NL due to double-quoted literal ..
$strWithNl = "hello\n world";
# but given arbitrary data, we change it back ..
$strWithSlashN = str_replace("\n", '\n', $strWithNl);

根据给定的一组规则,可能有更好的(阅读:现有的)函数来“反转义”字符串,但上面应该有希望展示这些概念。


虽然以上所有内容都是真实/有效的(或者如果不是应该更正),但我有一点额外的时间来创建一个escape_as_double_quoted_literal函数。

给定一个“ASCII 编码”字符串$str$escaped = escape_as_double_quoted_literal($str),它应该是eval("\"$escaped\"") == $str. 我不确定这个特定的功能什么时候有用(请不要说 eval !),但由于我在立即搜索后没有找到这样的功能,这是我的快速实现YMMV

function escape_as_double_quoted_literal_matcher ($m) {
    $ch = $m[0];
    switch ($ch) {
        case "\n": return '\n';
        case "\r": return '\r';
        case "\t": return '\t';
        case "\v": return '\v';
        case "\e": return '\e';
        case "\f": return '\f';
        case "\\": return '\\\\';
        case "\$": return '\$';
        case "\"": return '\\"';
        case "\0": return '\0';
        default:
            $h = dechex(ord($ch));
            return '\x' . (strlen($h) > 1 ? $h : '0' . $h);
    }
}

function escape_as_double_quoted_literal ($val) {
    return preg_replace_callback(
            "|[^\x20\x21\x23\x25-\x5b\x5e-\x7e]|",
            "escape_as_double_quoted_literal_matcher",
            $val);
}

以及这样的用法:

$text = "\0\1\xff\"hello\\world\"\n\$";
echo escape_as_double_quoted_literal($text);

(注意,它'\1'被编码为\x01; 两者在 PHP 双引号字符串文字中是等价的。)

于 2013-11-13T21:20:17.763 回答
0

"\n" 的答案是用文字字符替换任何潜在的换行符。 str_replace("\n", '\n', $myString)

不确定其他潜在特殊字符的一般情况。

于 2013-11-13T21:18:30.000 回答