preg_replace 没有从字符串中删除所有空白字符

preg_replace is not removing all whitespace characters from string

我得到了下面的代码,它应该是在去除所有空格后比较 2 个字符串,这里是该函数的简化版本:

function not_same($type, $org_str1, $str2) {

    $str1 = preg_replace('/\s+/', '', $org_str1);
    $str2 = preg_replace('/\s+/', '', $str2);

    $tries = [];
    $tries[] = ["str1" => $str1, "str2" => $str2, "encoded1" => urlencode($str1), "encoded2" => urlencode($str2)];        

    if($str1 == $str2) {
        return true;
    } else {
        return false;
    }

}

我正在使用它来检查计算机上的处理器是否与我的数据库中的匹配型号相同,所以 $org_str1 是我的客户所说的计算机 运行有,$str2 是我数据库中模型应该有的 cpu。

有时这些字符串有不需要的空格,因此在比较过程中我删除了所有的空格,以便比较文本本身。

现在我让计算机返回说 CPU 是错误的,因为没有匹配,因为有一些空格没有被删除。

在这种特定情况下,我尝试比较字符串客户端:Celeron® N3050 与服务器:Celeron® N3050。 每次在我的服务器上比较 actually 时,我都会记录,在我的客户端上它说它正在比较客户端:Celeron® N3050 与服务器:Celeron®N3050

我尝试将此空格复制并粘贴到 str_replace() 函数中,但没有解决问题。之后,我想到了用 urlencode() 记录字符串的想法,这让我可以准确地看到这个神秘的白色字符是什么,但我仍然不知道如何解决这个问题。

urlencode() 之后的字符串是 Client: Celeron%C2%AE%C2%A0N3050 vs Server: Celeron%C2%AEN3050

如您所见,我的客户端字符串中仍有一个空白字符,编码为 %C2%A0。为什么 preg_replace 没有去掉这个空格,我怎样才能以编程方式删除它?

\xC2\xA0 是一个不间断的 unicode space。将 u modifier 添加到您的正则表达式中。

$raw = urldecode('Celeron%C2%AE%C2%A0N3050');

var_dump(
    preg_replace('/\s+/', '', $raw),
    preg_replace('/\s+/u', '', $raw),
    urlencode($raw),
    urlencode(preg_replace('/\s+/u', '', $raw))
);

输出:

string(16) "Celeron® N3050"
string(14) "Celeron®N3050"
string(24) "Celeron%C2%AE%C2%A0N3050"
string(18) "Celeron%C2%AEN3050"