反斜杠在解析UTF8文本时引起问题

时间:2018-08-07 12:48:50

标签: php regex preg-match-all explode

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

我的第一次尝试是正则表达式。

$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"]

但是正则表达式所暗示的是,我不需要字符串的所有部分。

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

足够了。

编辑:我可以使用EOD"或任何其他初始化字符串的方法来使用。但是,由于在无法使用的文字中使用了'

1 个答案:

答案 0 :(得分:0)

使用Nowdoc这样,将“ END WORD”括在单引号内:

$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);