我有一个包含字符串的变量,我不知道字符串可能是什么,但它可能包含特殊字符。
我想“按原样”将其输出到文本文件中。因此,例如,如果有一个字符串“我的字符串\n”,我希望文本文件准确地显示它,而不是将 \n 解释为换行符/换行符。
我有一个包含字符串的变量,我不知道字符串可能是什么,但它可能包含特殊字符。
我想“按原样”将其输出到文本文件中。因此,例如,如果有一个字符串“我的字符串\n”,我希望文本文件准确地显示它,而不是将 \n 解释为换行符/换行符。
然后确保它在字符串中是“原样”,例如"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 双引号字符串文字中是等价的。)
"\n" 的答案是用文字字符替换任何潜在的换行符。
str_replace("\n", '\n', $myString)
不确定其他潜在特殊字符的一般情况。