【问题标题】:Backslash causing problems when parsing UTF8 text解析 UTF8 文本时出现问题的反斜杠
【发布时间】:2019-01-14 13:41:06
【问题描述】:

我使用 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" 或任何其他方式来启动字符串。但是由于文字中使用了',所以不能使用。

【问题讨论】:

  • 当我 var_export()'ed 你的字符串时我看到的是 3v4l.org/sLfLO 。可以看到反斜杠并不是真正意义上的反斜杠。
  • 双双转义反斜杠:$re = '/(\d{4})\\\\(\d{2})\\\\(\d{2})\\\\(.+?)\\\\(\d+)-(.+?)\\\\(.+?) -/m';
  • @Toto 奇怪的是它返回空。 3v4l.org/0l9W3 它应该可以工作,但由于某种原因,双重转义不起作用
  • 我刚刚尝试了一个小脚本,它工作正常。
  • 这就是我希望它做的事情。我刚刚在sandbox.onlinephpfunctions.com 上尝试过,但在那里也不起作用。

标签: php regex preg-match-all explode


【解决方案1】:

像这样使用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);

【讨论】:

  • 哈哈,这正是我刚刚发现的。很好,你现在发布了我不必自己做。但只是一个通知。这不是 Heredoc,这是 Nowdoc。 Heredoc 是我在 3v4l 上使用的,但我不知道有一个 nowdoc
  • @Andreas 我也是!虽然我使用了explode方法,但正要发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 2016-06-16
相关资源
最近更新 更多