我正在从数据库中获取数据文件的分隔符,并将其保存到某个$delimiter
var中,然后将其传递给文件读取器的类。
new CSVreader($delimiter);
问题是,它并没有把它当作制表符,而是把它当作backslash + t letter
字符串。
当我像new CSVreader("'t");
这样直接传递时,它可以正常
最后一个问题是:如何将database
中的't
字符串转换为special char (tab)
我使用UTF-8
进行数据库
您可以使用str_replace
:将't
替换为制表符
$text = str_replace(''t', "'t", $text);
如果您有更多的转义序列,而不仅仅是't
,str_replace
允许在数组中指定替换:
$text = str_replace(array(''t',''n',''r',''f',''b',''a',''e',''''''),
array("'t","'n","'r","'f","'010","'007","'033","''"), $text);
啊,以下是PHP中允许的转义序列的完整列表:http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.double
我应该指出,str_replace
没有正确地进行替换;这相当于按顺序替换每对。这意味着类似''t
的内容根据顺序扩展为制表符或制表符前面的反斜杠,而不是't
。使用strtr
:解决了这个问题
$text = strtr($text, array(''t'=>"'t",''n'=>"'n",''r'=>"'r",''f'=>"'f",
''b'=>"'010",''a'=>"'007",''e'=>"'033",''''''=>"''"));
您可以使用的另一个函数是stripcslashes
。它还实现了八进制和十六进制转义码,您可能需要也可能不需要。
PHP解释器会自动转义PHP源文件中的双引号字符串,因此new CSVreader("'t")
实际上表示一个TAB字符。
相反,当您从任何外部源读取字符串时,反斜杠采用其字面值:一个反斜杠和一个"t"。您可以在PHP源代码中将其表示为"''t"
(双引号)或''t'
(单引号),这不是您想要的。
无论如何,PHP为此提供了一个本机函数。stripcslashes()识别类C序列(''a、''b、''f、''n、''r、''t和''v),以及八进制和十六进制表示,将它们转换为实际含义。
// C-like escape sequence
stripcslashes(''t') === "'t"; // true;
// Hexadecimal escape sequence
stripcslashes(''x09') === "'t"; // true;
// Octal escape sequence
stripcslashes(''011') === "'t"; // true;
您可以使用str_replace()
&strtr()
用于精确替换。但是,如果您希望您的字符串像c字符串一样被解释,您可以使用stripcslashes()
,但您应该小心使用它,因为它取消了八进制&十六进制表示(例如,此stripcslashes('''0')
变为空字符)。
您可以使用此函数:
如果需要,可以使用更多特殊字符展开数组。
function myFunc($string) {
$search = array(''t', ''n', ''r'); //you can add more special chars here
$replace = array( "'t", "'n", "'r");
return str_replace($search, $replace, $string);
}
或者,如果你喜欢一句话:
echo str_replace(''t', "'t", $string);
希望这能有所帮助。
有几种方法。
<?php
function trans($string) {
return strtr($string, array(
''t' => "'t",
''r' => "'r",
''n' => "'n"
));
}
$string = 'Hello'tAnthony';
echo $string; //Hello'tAnthony
echo str_replace(''t', chr(9), $string); //Hello Anthony
echo trans($string); //Hello Anthony