将 2 preg_split 与正则表达式应用于文本
Apply 2 preg_split with regex to text
上下文:
我必须按照一组规则将每天收到的包含多个客户预订详细信息的电子邮件拆分。这是电子邮件的示例:
A N K U N F T 11.08.15
*** NEUBUCHUNG ***
11.08.15 xxx xxx X3 2830 14:25 17:50
18.08.15 xxx xxx X3 2831 18:40
F882129 dsdsaidsaia
F882129 xxxyxyagydaysd
sadsdsdsdsadsadadssda
sadsdsdsdsadsadadssda
**«CUT HERE2»**
A N K U N F T 18.08.15
*** NEUBUCHUNG ***
11.08.15 xxx xxx X3 2830 14:25 17:50
18.08.15 xxx xxx X3 2831 18:40
F881554 ZXCXZCXCXZCCXZ
F881554 xcvcxvcxvcvxc
F881554 xvcxvcxcvxxvccvxxcv
**«CUT HERE»**
11.08.15 xxx xxx X3 2830 14:25 17:50
18.08.15 xxx xxx X3 2831 18:40
F881605 xczxcdfsfdsdfs
F881605 zxccxzxzdffdsfds
**«CUT HERE»**
所以基本上只要出现最后一个F999999(9可以是任何数字)就必须剪掉,因为F999999是预订代码。*
我插入了文本:«CUT HERE» 只是为了更好地理解在哪里剪切。
*注意:预订代码可能有以下格式:F999999、A999999、E999999 或 999999。
所以我使用以下正则表达式应用工作 preg_split:
Regex1 = "/(?:\s(F|A|E)?\d{6}\s?+.*?\r\n\s?\r\n)\K//ms";
但是有时我必须在出现 «CUT HERE2» 的地方剪切,因为有时在预订代码分隔符之后会有一些文本。
所以我创建了这个正则表达式:
Regex2 = "/^\h*(F|A|E)?\d{6}.*?\R{2}\K/ms"
然而,我有时会使用这种格式(同一预订的 F999999 之间的换行符),使我之前的正则表达式 (regex2) 剪切到“不在此剪切”的位置:
A N K U N F T 11.08.15
*** NEUBUCHUNG ***
11.08.15 xxx xxx X3 2830 14:25 17:50
18.08.15 xxx xxx X3 2831 18:40
F882129 dsdsaidsaia
<<NOT CUT HERE>>
F882129 xxxyxyagydaysd
sadsdsdsdsadsadadssda
sadsdsdsdsadsadadssda
**«CUT HERE»**
A N K U N F T 18.08.15
*** NEUBUCHUNG ***
11.08.15 xxx xxx X3 2830 14:25 17:50
18.08.15 xxx xxx X3 2831 18:40
F881554 ZXCXZCXCXZCCXZ
<<NOT CUT HERE>>
F881554 xcvcxvcxvcvxc
F881554 xvcxvcxcvxxvccvxxcv
**«CUT HERE»**
11.08.15 xxx xxx X3 2830 14:25 17:50
18.08.15 xxx xxx X3 2831 18:40
F881605 xczxcdfsfdsdfs
F881605 zxccxzxzdffdsfds
**«CUT HERE»**
我只是想让它在 «CUT HERE» 出现的地方剪切。
发生此错误的示例:
***NEUBUCHUNG ***
23.02.17 DUS FNC DE 1414 12:05 15:10
09.03.17 FNC DUS DE 1415 16:40
FNC011 Enotel Baia 9360-215 Ponta do Sol
1 DZ Typ I Meerblick 2Erw. Frühstück
am 03.10.16 CRS: MX - PNR: 1290689
Fluggeber: Condor Flugdienst / PNR: 1290689 Frühbucher 10% inkl. Reiseleitung und Transfer ab/bis
A025808 HERR Berg, Ulrich 62
<<NOT CUT HERE>
Anfrage.
A025808 FRAU Berghaus, Petra 58
**«CUT HERE»**
***S T O R N O **
04.10.16 STR X3 2810
11.10.16 FNC STR X3 2811 18:15
FNC036 The Flame Tree Funchal
1 DZ Meerblick 2Erw. H
A987025 FRAU BURG, GERTRUD *** STORNO *** O
<<NOT CUT HERE>>
A987025 HERR BURG, WALTER *** STORNO *** O
**«CUT HERE»**
***ÄNDERUNG ***
NEU:01.11.16 FRA X3 2806 13:35 16:50
08.11.16 FNC FRA X3 2807 17:40
FNC813 Golden Residence/Wanderk. 9000-105 Funchal
1 Suite seitl. Meerblick 3Erw. F
A982512 FRAU KROST, SIMONE
Frühbucher 15%
<<NOT CUT HERE>>
inkl. Reiseleitung
und Transfer ab/bis
Im Reisepreis bereits enthalten: Drei
geführte Wanderungen (1 Ganztags- und 2
Halbtagswanderungen) inkl. aller
Transfers.
**«SHOULD CUT HERE»**
***ÄNDERUNG ***
ALT:01.11.16 FRA X3 2806 13:35 16:50
08.11.16 FNC FRA X3 2807 17:40
FNC813 Golden Residence/Wanderk. 9000-105 Funchal
1 Suite seitl. Meerblick 3Erw. F
A982512 HERR KROST, SIMONE
**«CUT HERE»**
25.04.17 DRS FNC ST 1602 13:25 17:15
09.05.17 FNC DRS ST 1607 00:00
FNC076 Baia Azul 9004-530 Funchal
1 DZ Typ I Meerblick 2Erw. Halbpension
am 03.10.16 CRS: MX - PNR: 15326821
Fluggeber: alltours / PNR: 15326821
inkl. Reiseleitung
und Transfer ab/bis Flughafen
A025986 HERR Schulze, Steffen 55
A025986 FRAU Schulze, Kerstin 54
**«CUT HERE»**
***S T O R N O **
13.11.16 FRA X3 2806
20.11.16 FNC FRA X3 2807 17:35
FNC096 Pestana Village & Miramar Funchal
1 Studio 2Erw. H
A976918 FRAU HEBING, BETTINA *** STORNO *** O
<<NOT CUT HERE>>
A976918 HERR HEBING, LUDGER *** STORNO *** O
**«CUT HERE»**
我把 «NOT CUT HERE» 放在它分开但不应该的地方。我把:«应该在此处剪切» 应该剪切的地方。如果它正确切割,我会输入 «CUT HERE»。
您可以使用
'~^\h*F\d{6}.*?\R{2}\K~sm'
详情:
^
- 行首
\h*
- 0+ 水平空格
F\d{6}
- F
+ 6 位数字
-.*?
- first 之前的任何 0+ 个字符
\R{2}
- 2 个换行符
\K
- 并省略整个匹配文本。
参见PHP demo:
$re = '~^\h*F\d{6}.*?\R{2}\K~ms';
$str = "A N K U N F T 11.08.15\n*** NEUBUCHUNG ***\n 11.08.15 xxx xxx X3 2830 14:25 17:50\n 18.08.15 xxx xxx X3 2831 18:40\n F882129 dsdsaidsaia\n F882129 xxxyxyagydaysd\nsadsdsdsdsadsadadssda\nsadsdsdsdsadsadadssda\n\nA N K U N F T 18.08.15\n*** NEUBUCHUNG ***\n 11.08.15 xxx xxx X3 2830 14:25 17:50\n 18.08.15 xxx xxx X3 2831 18:40\n F881554 ZXCXZCXCXZCCXZ\n F881554 xcvcxvcxvcvxc\n F881554 xvcxvcxcvxxvccvxxcv\n\n\n11.08.15 xxx xxx X3 2830 14:25 17:50\n 18.08.15 xxx xxx X3 2831 18:40\n F881605 xczxcdfsfdsdfs\n F881605 zxccxzxzdffdsfds\n\n";
print_r(preg_split($re, $str));
上下文: 我必须按照一组规则将每天收到的包含多个客户预订详细信息的电子邮件拆分。这是电子邮件的示例:
A N K U N F T 11.08.15
*** NEUBUCHUNG ***
11.08.15 xxx xxx X3 2830 14:25 17:50
18.08.15 xxx xxx X3 2831 18:40
F882129 dsdsaidsaia
F882129 xxxyxyagydaysd
sadsdsdsdsadsadadssda
sadsdsdsdsadsadadssda
**«CUT HERE2»**
A N K U N F T 18.08.15
*** NEUBUCHUNG ***
11.08.15 xxx xxx X3 2830 14:25 17:50
18.08.15 xxx xxx X3 2831 18:40
F881554 ZXCXZCXCXZCCXZ
F881554 xcvcxvcxvcvxc
F881554 xvcxvcxcvxxvccvxxcv
**«CUT HERE»**
11.08.15 xxx xxx X3 2830 14:25 17:50
18.08.15 xxx xxx X3 2831 18:40
F881605 xczxcdfsfdsdfs
F881605 zxccxzxzdffdsfds
**«CUT HERE»**
所以基本上只要出现最后一个F999999(9可以是任何数字)就必须剪掉,因为F999999是预订代码。* 我插入了文本:«CUT HERE» 只是为了更好地理解在哪里剪切。
*注意:预订代码可能有以下格式:F999999、A999999、E999999 或 999999。
所以我使用以下正则表达式应用工作 preg_split:
Regex1 = "/(?:\s(F|A|E)?\d{6}\s?+.*?\r\n\s?\r\n)\K//ms";
但是有时我必须在出现 «CUT HERE2» 的地方剪切,因为有时在预订代码分隔符之后会有一些文本。
所以我创建了这个正则表达式:
Regex2 = "/^\h*(F|A|E)?\d{6}.*?\R{2}\K/ms"
然而,我有时会使用这种格式(同一预订的 F999999 之间的换行符),使我之前的正则表达式 (regex2) 剪切到“不在此剪切”的位置:
A N K U N F T 11.08.15
*** NEUBUCHUNG ***
11.08.15 xxx xxx X3 2830 14:25 17:50
18.08.15 xxx xxx X3 2831 18:40
F882129 dsdsaidsaia
<<NOT CUT HERE>>
F882129 xxxyxyagydaysd
sadsdsdsdsadsadadssda
sadsdsdsdsadsadadssda
**«CUT HERE»**
A N K U N F T 18.08.15
*** NEUBUCHUNG ***
11.08.15 xxx xxx X3 2830 14:25 17:50
18.08.15 xxx xxx X3 2831 18:40
F881554 ZXCXZCXCXZCCXZ
<<NOT CUT HERE>>
F881554 xcvcxvcxvcvxc
F881554 xvcxvcxcvxxvccvxxcv
**«CUT HERE»**
11.08.15 xxx xxx X3 2830 14:25 17:50
18.08.15 xxx xxx X3 2831 18:40
F881605 xczxcdfsfdsdfs
F881605 zxccxzxzdffdsfds
**«CUT HERE»**
我只是想让它在 «CUT HERE» 出现的地方剪切。
发生此错误的示例:
***NEUBUCHUNG ***
23.02.17 DUS FNC DE 1414 12:05 15:10
09.03.17 FNC DUS DE 1415 16:40
FNC011 Enotel Baia 9360-215 Ponta do Sol
1 DZ Typ I Meerblick 2Erw. Frühstück
am 03.10.16 CRS: MX - PNR: 1290689
Fluggeber: Condor Flugdienst / PNR: 1290689 Frühbucher 10% inkl. Reiseleitung und Transfer ab/bis
A025808 HERR Berg, Ulrich 62
<<NOT CUT HERE>
Anfrage.
A025808 FRAU Berghaus, Petra 58
**«CUT HERE»**
***S T O R N O **
04.10.16 STR X3 2810
11.10.16 FNC STR X3 2811 18:15
FNC036 The Flame Tree Funchal
1 DZ Meerblick 2Erw. H
A987025 FRAU BURG, GERTRUD *** STORNO *** O
<<NOT CUT HERE>>
A987025 HERR BURG, WALTER *** STORNO *** O
**«CUT HERE»**
***ÄNDERUNG ***
NEU:01.11.16 FRA X3 2806 13:35 16:50
08.11.16 FNC FRA X3 2807 17:40
FNC813 Golden Residence/Wanderk. 9000-105 Funchal
1 Suite seitl. Meerblick 3Erw. F
A982512 FRAU KROST, SIMONE
Frühbucher 15%
<<NOT CUT HERE>>
inkl. Reiseleitung
und Transfer ab/bis
Im Reisepreis bereits enthalten: Drei
geführte Wanderungen (1 Ganztags- und 2
Halbtagswanderungen) inkl. aller
Transfers.
**«SHOULD CUT HERE»**
***ÄNDERUNG ***
ALT:01.11.16 FRA X3 2806 13:35 16:50
08.11.16 FNC FRA X3 2807 17:40
FNC813 Golden Residence/Wanderk. 9000-105 Funchal
1 Suite seitl. Meerblick 3Erw. F
A982512 HERR KROST, SIMONE
**«CUT HERE»**
25.04.17 DRS FNC ST 1602 13:25 17:15
09.05.17 FNC DRS ST 1607 00:00
FNC076 Baia Azul 9004-530 Funchal
1 DZ Typ I Meerblick 2Erw. Halbpension
am 03.10.16 CRS: MX - PNR: 15326821
Fluggeber: alltours / PNR: 15326821
inkl. Reiseleitung
und Transfer ab/bis Flughafen
A025986 HERR Schulze, Steffen 55
A025986 FRAU Schulze, Kerstin 54
**«CUT HERE»**
***S T O R N O **
13.11.16 FRA X3 2806
20.11.16 FNC FRA X3 2807 17:35
FNC096 Pestana Village & Miramar Funchal
1 Studio 2Erw. H
A976918 FRAU HEBING, BETTINA *** STORNO *** O
<<NOT CUT HERE>>
A976918 HERR HEBING, LUDGER *** STORNO *** O
**«CUT HERE»**
我把 «NOT CUT HERE» 放在它分开但不应该的地方。我把:«应该在此处剪切» 应该剪切的地方。如果它正确切割,我会输入 «CUT HERE»。
您可以使用
'~^\h*F\d{6}.*?\R{2}\K~sm'
详情:
^
- 行首\h*
- 0+ 水平空格F\d{6}
-F
+ 6 位数字 -.*?
- first 之前的任何 0+ 个字符
\R{2}
- 2 个换行符\K
- 并省略整个匹配文本。
参见PHP demo:
$re = '~^\h*F\d{6}.*?\R{2}\K~ms';
$str = "A N K U N F T 11.08.15\n*** NEUBUCHUNG ***\n 11.08.15 xxx xxx X3 2830 14:25 17:50\n 18.08.15 xxx xxx X3 2831 18:40\n F882129 dsdsaidsaia\n F882129 xxxyxyagydaysd\nsadsdsdsdsadsadadssda\nsadsdsdsdsadsadadssda\n\nA N K U N F T 18.08.15\n*** NEUBUCHUNG ***\n 11.08.15 xxx xxx X3 2830 14:25 17:50\n 18.08.15 xxx xxx X3 2831 18:40\n F881554 ZXCXZCXCXZCCXZ\n F881554 xcvcxvcxvcvxc\n F881554 xvcxvcxcvxxvccvxxcv\n\n\n11.08.15 xxx xxx X3 2830 14:25 17:50\n 18.08.15 xxx xxx X3 2831 18:40\n F881605 xczxcdfsfdsdfs\n F881605 zxccxzxzdffdsfds\n\n";
print_r(preg_split($re, $str));