Я работаю над тем, чтобы получить некоторые тексты песен, используя 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...
, где каждые два символа являются одним байтом в шестнадцатеричной системе. Вы можете сделать это более понятным с чем-то вроде:
echo join(' ', str_split(bin2hex($word), 2)); // 66 6f 6f ...
Теперь используйте свою любимую таблицу ASCII / Unicode (в зависимости от кодировки строки), чтобы выяснить, что представляют собой отдельные символы, и откуда вы их получили.
Возможно, ваша строка закодирована в UTF-16, и в этом случае вы должны увидеть контрольные 00
байтов каждые два символа.