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", "&nbsp;"," &shy;",":"), ' ', $string);
    $string = str_ireplace(array("&shy;","&laquo;","&raquo;","&pound;"), '', $string);
    return trim($string, ",;.:-_*+~#'\"´`!§$%&/()=?«»")
}

它做各种各样的事情,但我面临的问题与最后的 trim 功能有关。它应该 trim 去掉空格和特殊字符,并且工作正常,直到最近,当我在 trim 中添加两个远离字符串的特殊字符时:«»。这导致另一个特殊字符出现问题:

当我将单词 België 传递给函数时,ë 被破坏并且 elastic 抛出错误。

trim 不支持编码,只查看单个字节。如果你告诉它 trim '«»',并且它是用 UTF-8 编码的,它会寻找字节 C2 AB C2 BB(其中 C2 是多余的,所以 AB BB C2 是实际的搜索词)。 UTF-8 中的“ë”是 C3 AB,因此它的一半被删除,字符因此被破坏。

您需要使用编码感知函数来安全删除多字节字符,例如:

preg_replace('/^[«»]+|[«»]+$/u', '', $str)