反斜杠在解析 UTF8 文本时导致问题
Backslash causing problems when parsing UTF8 text
我使用 windows cmd dir /s 命令获取所有 pdf 文件的列表。
现在我想解析文本并创建一个简单的 table,我可以将其复制粘贴到 Excel(在完成更多文本解析后)。
只是为了解释为什么我不想在 Excel 中这样做,我需要使用 levenshtein 函数来 unifrom/group 类似的项目。但这不是问题的一部分,我可以稍后自己做。
我的第一次尝试是正则表达式。
$re = '/(\d{4})\(\d{2})\(\d{2})\(.+?)\(\d+)-(.+?)\(.+?) -/m';
$re = '/(\d{4}).(\d{2}).(\d{2}).(.+?).(\d+)-(.+?)\\(.+?) -/m';
当我 运行 它们在 3v4l but on on 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\Avvikelser18\ALIMENTOS DEL MEDITERRANE3715000-Vattenmelon\Kvalitets fel - avvikelse27210.pdf
H:\Dokument\Avvikelser18\GRÖNSAKSMÄSTARNA SVERIGE[=13=]0233003-Kålrötter 6kg RB\Kvalitets fel - avvikelse27245.pdf
H:\Dokument\Avvikelser18\GRÖNSAKSMÄSTARNA SVERIGE[=13=]0223005-Isbergssall. påse RB\Kvalitets fel - avvikelse27244.pdf
H:\Dokument\Avvikelser18\GRÖNSAKSMÄSTARNA SVERIGE3005000-Isberg påse RB\Kvalitets fel - avvikelse27272.pdf
H:\Dokument\Avvikelser18\TERRA NATURA INTERNATIONA7711000-Tomat kvist 5kg\ - avvikelse27270.pdf
H:\Dokument\Avvikelser18\TERRA NATURA INTERNATIONA7711000-Tomat kvist 5kg\Kvalitets fel - avvikelse27270.pdf
H:\Dokument\Avvikelser18\LCT i Skåne1715000-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
或 "
或任何其他方式启动字符串。但是因为文中用了'
所以不能用
像这样使用 Nowdoc,用单引号将 "END WORD" 括起来:
$str = <<<'EOD'
H:\Dokument\Avvikelser18\ALIMENTOS DEL MEDITERRANE3715000-Vattenmelon\Kvalitets fel - avvikelse27210.pdf
H:\Dokument\Avvikelser18\GRÖNSAKSMÄSTARNA SVERIGE[=10=]0233003-Kålrötter 6kg RB\Kvalitets fel - avvikelse27245.pdf
H:\Dokument\Avvikelser18\GRÖNSAKSMÄSTARNA SVERIGE[=10=]0223005-Isbergssall. påse RB\Kvalitets fel - avvikelse27244.pdf
H:\Dokument\Avvikelser18\GRÖNSAKSMÄSTARNA SVERIGE3005000-Isberg påse RB\Kvalitets fel - avvikelse27272.pdf
H:\Dokument\Avvikelser18\TERRA NATURA INTERNATIONA7711000-Tomat kvist 5kg\ - avvikelse27270.pdf
H:\Dokument\Avvikelser18\TERRA NATURA INTERNATIONA7711000-Tomat kvist 5kg\Kvalitets fel - avvikelse27270.pdf
H:\Dokument\Avvikelser18\LCT i Skåne1715000-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);
我使用 windows cmd dir /s 命令获取所有 pdf 文件的列表。
现在我想解析文本并创建一个简单的 table,我可以将其复制粘贴到 Excel(在完成更多文本解析后)。
只是为了解释为什么我不想在 Excel 中这样做,我需要使用 levenshtein 函数来 unifrom/group 类似的项目。但这不是问题的一部分,我可以稍后自己做。
我的第一次尝试是正则表达式。
$re = '/(\d{4})\(\d{2})\(\d{2})\(.+?)\(\d+)-(.+?)\(.+?) -/m';
$re = '/(\d{4}).(\d{2}).(\d{2}).(.+?).(\d+)-(.+?)\\(.+?) -/m';
当我 运行 它们在 3v4l but on on 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\Avvikelser18\ALIMENTOS DEL MEDITERRANE3715000-Vattenmelon\Kvalitets fel - avvikelse27210.pdf
H:\Dokument\Avvikelser18\GRÖNSAKSMÄSTARNA SVERIGE[=13=]0233003-Kålrötter 6kg RB\Kvalitets fel - avvikelse27245.pdf
H:\Dokument\Avvikelser18\GRÖNSAKSMÄSTARNA SVERIGE[=13=]0223005-Isbergssall. påse RB\Kvalitets fel - avvikelse27244.pdf
H:\Dokument\Avvikelser18\GRÖNSAKSMÄSTARNA SVERIGE3005000-Isberg påse RB\Kvalitets fel - avvikelse27272.pdf
H:\Dokument\Avvikelser18\TERRA NATURA INTERNATIONA7711000-Tomat kvist 5kg\ - avvikelse27270.pdf
H:\Dokument\Avvikelser18\TERRA NATURA INTERNATIONA7711000-Tomat kvist 5kg\Kvalitets fel - avvikelse27270.pdf
H:\Dokument\Avvikelser18\LCT i Skåne1715000-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
或 "
或任何其他方式启动字符串。但是因为文中用了'
所以不能用
像这样使用 Nowdoc,用单引号将 "END WORD" 括起来:
$str = <<<'EOD'
H:\Dokument\Avvikelser18\ALIMENTOS DEL MEDITERRANE3715000-Vattenmelon\Kvalitets fel - avvikelse27210.pdf
H:\Dokument\Avvikelser18\GRÖNSAKSMÄSTARNA SVERIGE[=10=]0233003-Kålrötter 6kg RB\Kvalitets fel - avvikelse27245.pdf
H:\Dokument\Avvikelser18\GRÖNSAKSMÄSTARNA SVERIGE[=10=]0223005-Isbergssall. påse RB\Kvalitets fel - avvikelse27244.pdf
H:\Dokument\Avvikelser18\GRÖNSAKSMÄSTARNA SVERIGE3005000-Isberg påse RB\Kvalitets fel - avvikelse27272.pdf
H:\Dokument\Avvikelser18\TERRA NATURA INTERNATIONA7711000-Tomat kvist 5kg\ - avvikelse27270.pdf
H:\Dokument\Avvikelser18\TERRA NATURA INTERNATIONA7711000-Tomat kvist 5kg\Kvalitets fel - avvikelse27270.pdf
H:\Dokument\Avvikelser18\LCT i Skåne1715000-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);