Почему var_dump возвращает большее значение, чем длина строки?

Я работаю над получением текста песни с помощью 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 действует так?

Благодарю.

4

Решение

Наиболее вероятным ответом является то, что строка содержит непечатаемые символы за пределами «вы». Чтобы выяснить, что именно он содержит, вам нужно взглянуть на необработанные байты. Сделать это с echo bin2hex($word), Это выводит строку как 666f6f...где каждые 2 символа — один байт в шестнадцатеричной записи. Вы можете сделать это более читабельным с помощью чего-то вроде:

echo join(' ', str_split(bin2hex($word), 2));
// 66 6f 6f ...

Теперь используйте вашу любимую таблицу ASCII / Unicode (в зависимости от кодировки строки), чтобы выяснить, какие отдельные символы они представляют и откуда вы их взяли.

Возможно, ваша строка закодирована в UTF-16, и в этом случае вы должны увидеть контрольную 00 байты каждые два символа.

11

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]