PHP trim 特殊字符破坏其他特殊字符
PHP trim special character destroys other special character
我正在使用这个函数来清理弹性搜索的字符串:
function cleanString($string){
$string = mb_convert_encoding($string, "UTF-8");
$string = str_ireplace(array('<', '>'), array(' <', '> '), $string);
$string = strip_tags($string);
$string = filter_var($string, FILTER_SANITIZE_STRING);
$string = str_ireplace(array("\t", "\n", "\r", " "," ­",":"), ' ', $string);
$string = str_ireplace(array("­","«","»","£"), '', $string);
return trim($string, ",;.:-_*+~#'\"´`!§$%&/()=?«»")
}
它做各种各样的事情,但我面临的问题与最后的 trim
功能有关。它应该 trim 去掉空格和特殊字符,并且工作正常,直到最近,当我在 trim 中添加两个远离字符串的特殊字符时:«
和 »
。这导致另一个特殊字符出现问题:
当我将单词 België
传递给函数时,ë
被破坏并且 elastic 抛出错误。
- 为什么 trim 破坏了一个完全不同的角色?
- 我该如何解决
那,所以我解析出
«
和 »
并保留 ë
?
trim
不支持编码,只查看单个字节。如果你告诉它 trim '«»'
,并且它是用 UTF-8 编码的,它会寻找字节 C2 AB C2 BB
(其中 C2
是多余的,所以 AB BB C2
是实际的搜索词)。 UTF-8 中的“ë”是 C3 AB
,因此它的一半被删除,字符因此被破坏。
您需要使用编码感知函数来安全删除多字节字符,例如:
preg_replace('/^[«»]+|[«»]+$/u', '', $str)
我正在使用这个函数来清理弹性搜索的字符串:
function cleanString($string){
$string = mb_convert_encoding($string, "UTF-8");
$string = str_ireplace(array('<', '>'), array(' <', '> '), $string);
$string = strip_tags($string);
$string = filter_var($string, FILTER_SANITIZE_STRING);
$string = str_ireplace(array("\t", "\n", "\r", " "," ­",":"), ' ', $string);
$string = str_ireplace(array("­","«","»","£"), '', $string);
return trim($string, ",;.:-_*+~#'\"´`!§$%&/()=?«»")
}
它做各种各样的事情,但我面临的问题与最后的 trim
功能有关。它应该 trim 去掉空格和特殊字符,并且工作正常,直到最近,当我在 trim 中添加两个远离字符串的特殊字符时:«
和 »
。这导致另一个特殊字符出现问题:
当我将单词 België
传递给函数时,ë
被破坏并且 elastic 抛出错误。
- 为什么 trim 破坏了一个完全不同的角色?
- 我该如何解决
那,所以我解析出
«
和»
并保留ë
?
trim
不支持编码,只查看单个字节。如果你告诉它 trim '«»'
,并且它是用 UTF-8 编码的,它会寻找字节 C2 AB C2 BB
(其中 C2
是多余的,所以 AB BB C2
是实际的搜索词)。 UTF-8 中的“ë”是 C3 AB
,因此它的一半被删除,字符因此被破坏。
您需要使用编码感知函数来安全删除多字节字符,例如:
preg_replace('/^[«»]+|[«»]+$/u', '', $str)