2015-01-23 3 views
3

Я работаю над тем, чтобы получить некоторые тексты песен с использованием API и преобразовать текст песни в массив слов. Я получаю необычное поведение в функции preg_replace. Когда я выполнил некоторую отладку с помощью var_dump, я вижу, что var_dump возвращает значение 10 для строки «you», которая говорит мне, что может быть что-то не так. После этого preg_replace действует странно.Почему var_dump возвращает большее значение, чем длина строки?

Это мой код:

$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 действует так?

Спасибо.

+1

Это, вероятно, проблема с кодировкой, 'var_dump' возвращает количество байтов, а не количество символов, вы можете показать исходную строку или лучше, откуда она взята. –

+1

try 'echo htmlentities (htmlentities ($ word))', чтобы увидеть, есть ли какие-либо специальные символы или что-то –

+0

«Вы» и «Вы» разные –

ответ

8

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

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

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

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

+0

yep функция эха возвращает это: 3c 6c 79 72 69 63 3e 79 6f 75 – Baykal

+1

Это ' you'. Недопустимые символы интерпретируются как тег браузером. – duskwuff

+0

@Baykal Protip: не используйте браузер для отладки или, по крайней мере, посмотрите на исходный код страницы. – deceze

Смежные вопросы