我正在努力使用API获取一些歌词,并将歌词字符串转换为单词数组。我在preg_replace函数中得到了一些不寻常的行为。当我使用var_dump进行一些调试时,我看到var_dump为字符串"你"返回值10,这告诉我可能有错误。之后,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为&#34;你&#34;?返回10的值?为什么preg_replace就是这样的呢?
感谢。
答案 0 :(得分:11)
最有可能的答案是该字符串包含“你”以外的不可打印字符。要弄清楚它究竟包含什么,你必须查看原始字节。使用echo bin2hex($word)
执行此操作。这将输出类似666f6f...
的字符串,其中每2个字符是十六进制表示法中的一个字节。您可以通过以下方式使其更具可读性:
echo join(' ', str_split(bin2hex($word), 2));
// 66 6f 6f ...
现在使用您最喜欢的ASCII / Unicode表(取决于字符串的编码)来确定那些代表的字符以及从中获取它们的位置。
也许你的字符串是用UTF-16编码的,在这种情况下你应该每两个字符看到一个00
个字节。