Иногда возникает такая задачка - понять почему две одинаковые строки кажутся для программы разными, а для нас одинаковыми.
Если в случае с буквой с и c (латинская и кириллическая) и а/a можно методом ctrl+c, ctrl+f вычислить злосчастное слово, то с такими вещами, как обычный пробел и неразрывный пробел может быть дикое замешательство, что sublime text, что firefox нормально находил первую подстроку во второй, а вот php так не считал...
Для своих исследований я написал вот такую функцию на PHP
define('BR','<br>');
function str_pars($str)
{
$len = mb_strlen($str);
echo BR.$str.' (length='.$len.')'.BR;
for ($i=0;$i<$len;$i++)
{
$char = mb_substr($str,$i,1);
echo 'ch="'.$char.'"('.mb_ord($char).')'.BR;
}
}
Это выведет посимвольно всю строку и для каждого символа покажет его код UTF, далее можете заглянуть вот сюда.
У меня во всех строках был пробел с кодом 32, а в одной из них 160.
Предварительно код нужно перевести в 16 ричную систему, т.е. 160 = A0, значит по первой колонке ищем U+00A0
Есть и более интересные варианты, когда Й выражается через И и сдвинутую надстрочную галочку ̆, (й) в UTF достаточно много интересных символов. И буква ё и много другого во входных данных может казаться схожим внешне, но разными символами.
Скопируйте символ й в блокнот, попробуйте удалить букву и получите удаление надстрочного....
На хабре есть статья по этой теме
Чтобы нормализовать пробелы и заменить двойные пробелы на одинарные, я использую вот такую конструкцию
$str = preg_replace('/\s{1,}/u', " ", $str);