将2 preg_split与regex一起应用于文本


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是保留代码*我插入文本:«剪切这里»只是为了更好地了解剪切的位置。

*注意:预订代码可能具有以下格式: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之间的换行符(,使我以前的regex(regex2(剪切到它说"NOT cut HERE"的地方:

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»**

我只想把它切到«切到这里»出现的地方。

此错误发生在例如:

***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"放在它分裂但不应该分裂的地方。我把:«应该切在这里»它应该切的地方。我在这里放了"切割",如果切割正确的话。

您可以使用

'~^'h*F'd{6}.*?'R{2}'K~sm'

查看regex演示

详细信息

  • ^—线路起点
  • 'h*-0+水平空白
  • F'd{6}-F+6位-.*?-任何0+个字符,直到第一个
  • 'R{2}-2个换行符
  • 'K-并省略整个匹配文本

参见PHP演示:

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