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

时间:2018-09-24 19:22:56

标签: php preg-replace whitespace

我有以下代码,应该在删除所有空格后比较两个字符串,这是该函数的简化版本:

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是我的客户所说的运行计算机,{{1 }}是模型应该在我的数据库中使用的CPU。

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

现在我要让计算机返回,说CPU错误,因为没有进行匹配,因为有些空白没有被删除。

在这种特定情况下,我试图将字符串Client:$str2与Server:Celeron® N3050进行比较。 每当我在服务器上比较实际时,我都会记录日志,在我的客户端上它表示正在比较客户端:Celeron® N3050与服务器:Celeron® N3050

我尝试将空白复制并粘贴到Celeron®N3050函数中,但是并不能解决问题。之后,我想到了用str_replace()记录字符串的想法,这使我可以确切地知道这个神秘的白色字符是什么,但是我仍然对如何解决该问题感到困惑。

urlencode()之后的字符串是客户端:urlencode() vs服务器:Celeron%C2%AE%C2%A0N3050

如您所见,我的客户字符串中仍然有一个空格字符,编码为Celeron%C2%AEN3050。为什么preg_replace无法摆脱这个空白,我如何以编程方式删除它?

1 个答案:

答案 0 :(得分:3)

\xC2\xA0是Unicode的不间断空格。将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"