php 在通过fgetcsv()从csv提取的url上使用parse_url()时出现问题

pcww981p  于 2023-02-03  发布在  PHP
关注(0)|答案(1)|浏览(95)

我确实有一个相当奇怪的事情发生在我身上,我似乎不能找出我的问题在哪里,我有一个csv文件,我用来导出数据。它充满了URL和其他东西。我已经提取了URL在这个数组$urlsOfCsv
我将csv行提取到一个数组中,方法如下:

$request->file('file')->move(public_path('uploads/temp/'),'tempcsv.csv');

        $file = fopen(public_path('uploads/temp/').'tempcsv.csv',"r");

        $lines = [];

        fgetcsv($file, 10000, ",");
        $o=0;
        while (($data = fgetcsv($file, 0, "\t")) !== FALSE) {
            $lines[$o]= $data;
            $o++;
        }
        fclose($file);
        File::delete($file);

        $urlsOfCsv = array_column($lines,0);

但是我不能用parse_url()提取域,因为我得到了这个奇怪的东西:

foreach($urlsOfCsv as $url){
            var_dump($url);
            var_dump(parse_url($url));  
        }

会给予这样的结果:

string(41) "https://www.h4d.com/" array(1) { ["path"]=> string(41) "_h_t_t_p_s_:_/_/_w_w_w_._h_4_d_._c_o_m_/_" }
string(73) "https://www.campussuddesmetiers.com/" array(1) { ["path"]=> string(73) "_h_t_t_p_s_:_/_/_w_w_w_._c_a_m_p_u_s_s_u_d_d_e_s_m_e_t_i_e_r_s_._c_o_m_/_" }
string(69) "http://altitoy-ternua.com/?lang=es" array(2) { ["path"]=> string(53) "_h_t_t_p_:_/_/_a_l_t_i_t_o_y_-_t_e_r_n_u_a_._c_o_m_/_" ["query"]=> string(15) "_l_a_n_g_=_e_s_" }
string(81) "https://www.opquast.com/communaute/jobs/" array(1) { ["path"]=> string(81) "_h_t_t_p_s_:_/_/_w_w_w_._o_p_q_u_a_s_t_._c_o_m_/_c_o_m_m_u_n_a_u_t_e_/_j_o_b_s_/_" }

我甚至没有数组中的“host”键。
你知道为什么我会得到这个结果吗?
我用regex试了很多方法来使用其他函数。但是我得到的不是空结果就是什么。
我想这和csv的东西有关,但我找不到在哪里。

qyswt5oh

qyswt5oh1#

多亏了Cbroe,我找到了一个非常明显的解决方案。我的csv文件中有错误的编码。经过一点研究,我发现我的文件是用UTF-16编码的。我试着用这种方式转换编码(考虑到双循环,这可能不是最佳的):

while (($data = fgetcsv($file, 0, "\t")) !== FALSE) {
   for($i=0;$i<count($data);$i++){
      $data[$i] = mb_convert_encoding( $data[$i],'UTF-8','UTF-16');
   }
   $lines[$o]= $data;
   $o++;
}

而且现在它工作得很好。parse_url()会给予我期待的结果(UrlParser::getDomain()对我也有效)。

相关问题