代码之家  ›  专栏  ›  技术社区  ›  Andreas

反斜杠导致分析UTF8文本时出现问题

  •  0
  • Andreas  · 技术社区  · 6 年前

    我使用windows cmd dir/s命令获取所有pdf文件的列表。
    现在,我想解析文本并创建一个简单的表,我可以复制粘贴到Excel(在一些更多的文本解析完成后)。
    为了解释为什么我不想在Excel中这样做,我需要使用levenshtein函数来统一/分组类似的项。但这不是问题的一部分,我以后可以自己做。

    我的第一次尝试是regex。

    $re = '/(\d{4})\\(\d{2})\\(\d{2})\\(.+?)\\(\d+)-(.+?)\\(.+?) -/m';
    $re = '/(\d{4}).(\d{2}).(\d{2}).(.+?).(\d+)-(.+?)\\\\(.+?) -/m';
    

    当我运行它们时,它们都不起作用 3v4l 但在上 regex101 第一个可行,第二个是一个简化版本,其中点替换反斜杠。
    但不幸的是,没有反斜杠,我无法解析最后一位。

    我的第二次尝试是在反斜杠上进行简单的爆炸,但没有成功

    $arr = explode("\n", $str);
    
    foreach($arr as $line){
        $parts = explode('\\', $line);
        var_dump($parts);
    }
    

    https://3v4l.org/JZ8gR
    因为反斜杠被用作字符串中的转义符。
    所以我试着用破折号代替反斜杠。

    $arr = explode("\n", str_replace("\\", "-", $str));
    var_dump($arr);/*
    

    https://3v4l.org/Xcs0G
    但我的短信又一次找到了打败我的方法。

    全文可以在上面的任何链接中找到。一个小例子:

    H:\Dokument\Avvikelser\2018\08\03\ALIMENTOS DEL MEDITERRANE\243715000-Vattenmelon\Kvalitets fel - avvikelse27210.pdf
    H:\Dokument\Avvikelser\2018\08\06\GRÖNSAKSMÄSTARNA SVERIGE\000233003-Kålrötter 6kg RB\Kvalitets fel - avvikelse27245.pdf
    H:\Dokument\Avvikelser\2018\08\06\GRÖNSAKSMÄSTARNA SVERIGE\000223005-Isbergssall. påse RB\Kvalitets fel - avvikelse27244.pdf
    H:\Dokument\Avvikelser\2018\08\06\GRÖNSAKSMÄSTARNA SVERIGE\223005000-Isberg påse RB\Kvalitets fel - avvikelse27272.pdf
    H:\Dokument\Avvikelser\2018\08\06\TERRA NATURA INTERNATIONA\277711000-Tomat kvist 5kg\ - avvikelse27270.pdf
    H:\Dokument\Avvikelser\2018\08\06\TERRA NATURA INTERNATIONA\277711000-Tomat kvist 5kg\Kvalitets fel - avvikelse27270.pdf
    H:\Dokument\Avvikelser\2018\08\06\LCT i Skåne\221715000-Ingefära 5kg\Kvalitets fel - avvikelse27279.pdf
    

    我所期望的是每一行的解析方式是反斜杠不会引起问题。
    例子:

    ["H:", "Dokument", "Avvikelser",", "2018", "08", "06", "LCT i Skåne", "221715000", "Ingefära 5kg", "Kvalitets fel", "avvikelse27279.pdf"]
    

    但正如regex所暗示的,我不需要字符串的所有部分。

    ["2018", "08", "06", "LCT i Skåne", "221715000", "Ingefära 5kg", "Kvalitets fel"]
    

    够了。

    编辑:我可以用 EOD " 或任何其他启动字符串的方法。但是自从 ' 在无法使用的文本中使用。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Toto    6 年前

    使用 Nowdoc 像这样,用单引号将“结束词”括起来:

    $str = <<<'EOD'
    H:\Dokument\Avvikelser\2018\08\03\ALIMENTOS DEL MEDITERRANE\243715000-Vattenmelon\Kvalitets fel - avvikelse27210.pdf
    H:\Dokument\Avvikelser\2018\08\06\GRÖNSAKSMÄSTARNA SVERIGE\000233003-Kålrötter 6kg RB\Kvalitets fel - avvikelse27245.pdf
    H:\Dokument\Avvikelser\2018\08\06\GRÖNSAKSMÄSTARNA SVERIGE\000223005-Isbergssall. påse RB\Kvalitets fel - avvikelse27244.pdf
    H:\Dokument\Avvikelser\2018\08\06\GRÖNSAKSMÄSTARNA SVERIGE\223005000-Isberg påse RB\Kvalitets fel - avvikelse27272.pdf
    H:\Dokument\Avvikelser\2018\08\06\TERRA NATURA INTERNATIONA\277711000-Tomat kvist 5kg\ - avvikelse27270.pdf
    H:\Dokument\Avvikelser\2018\08\06\TERRA NATURA INTERNATIONA\277711000-Tomat kvist 5kg\Kvalitets fel - avvikelse27270.pdf
    H:\Dokument\Avvikelser\2018\08\06\LCT i Skåne\221715000-Ingefära 5kg\Kvalitets fel - avvikelse27279.pdf
    EOD;
    
    $re = '/(\d{4})\\\\(\d{2})\\\\(\d{2})\\\\(.+?)\\\\(\d+)-(.+?)\\\\(.+?) -/m';
    $res = preg_match($re, $str, $m);
    
    print_r($m);