Я работаю над получением текста песни с помощью API и преобразовываю строку текста в массив слов. Я получаю некоторые необычные поведения в функции preg_replace. Когда я выполнил некоторую отладку с использованием var_dump, я вижу, что var_dump возвращает значение 10 для строки «you», что говорит мне, что может быть что-то не так. После этого preg_replace действует странно.
Это мой код:
$source = get_chart_lyrics_data("madonna","frozen");
$pieces = explode("\n", $source);
$lyrics = array();
for($i=0;$i<count($pieces);$i++){
if($i>10){
$words = explode(" ",$pieces[$i]);
foreach($words as $_word){
if($_word=="")
continue;
var_dump($_word);
$word = strtolower($_word);
var_dump($word);
$word = trim($word);
var_dump($word);
$word = preg_replace("/[^A-Za-z ]/", '', $word);
var_dump($word);
$lyrics[$word]++;
}
}
}
Это первые 4 строки, которые возвращает этот код:
string(10) “You”
string(10) “you”
string(10) “you”
string(8) “lyricyou”
Почему var_dump возвращает значение 10 для вас? И почему preg_replace действует так?
Благодарю.
Наиболее вероятным ответом является то, что строка содержит непечатаемые символы за пределами «вы». Чтобы выяснить, что именно он содержит, вам нужно взглянуть на необработанные байты. Сделать это с echo bin2hex($word)
, Это выводит строку как 666f6f...
где каждые 2 символа — один байт в шестнадцатеричной записи. Вы можете сделать это более читабельным с помощью чего-то вроде:
echo join(' ', str_split(bin2hex($word), 2));
// 66 6f 6f ...
Теперь используйте вашу любимую таблицу ASCII / Unicode (в зависимости от кодировки строки), чтобы выяснить, какие отдельные символы они представляют и откуда вы их взяли.
Возможно, ваша строка закодирована в UTF-16, и в этом случае вы должны увидеть контрольную 00
байты каждые два символа.
Других решений пока нет …