Php 使用正则表达式对文本应用2个preg_分割

Php 使用正则表达式对文本应用2个preg_分割,php,regex,expression,preg-match,preg-split,Php,Regex,Expression,Preg Match,Preg Split,背景: 我必须将每天收到的一封包含多个客户预订详细信息的电子邮件拆分,并制定一套规则。这是电子邮件的一个示例: 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 s

背景: 我必须将每天收到的一封包含多个客户预订详细信息的电子邮件拆分,并制定一套规则。这是电子邮件的一个示例:

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»**
因此,只要最后一个F9999999出现(其中9可以是任意数字),它基本上就必须被删除,因为F9999999是预订代码* 我插入了文本:«此处剪切»只是为了更好地理解剪切的位置

*注意:预订代码可能有以下格式:F999999、A999999、E999999或999999

因此,我使用以下正则表达式应用工作preg_分割:

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和F99999之间,属于同一保留),在显示“此处不剪切”的地方剪切我以前的正则表达式(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»**
ankunft 11.08.15
***新不冲***
11.08.15 xxx xxx X3 2830 14:25 17:50
18.08.15 xxx xxx X3 2831 18:40
F882129 DSAIDSAIA
F882129 xxxyxyagydaysd
SadSDSadADSSDA
SadSDSadADSSDA
**«此处切入»**
A N K U N F T 18.08.15
***新不冲***
11.08.15 xxx xxx X3 2830 14:25 17:50
18.08.15 xxx xxx X3 2831 18:40
F881554 ZxCxCxCxCxZ
F881554 xVCxVCxVCvxC
F881554 xVCxVCxVxxVCCVxxCV
**«此处切入»**
11.08.15 xxx xxx X3 2830 14:25 17:50
18.08.15 xxx xxx X3 2831 18:40
F881605 xczxcdfsfdsdfs
F881605 ZxCxZxZDFDSFDS
**«此处切入»**
我只想在出现«此处剪切»的地方剪切

例如,会发生此错误:

***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»**
***NEUBUCHUNG***
23.02.17杜斯FNC DE 1414 12:05 15:10
2017年3月9日FNC DUS DE 1415 16:40
FNC011伊诺特拜亚9360-215蓬塔杜索尔酒店
1个DZ类型I Meerbrick 2个RW。弗鲁赫斯图克
2016年10月3日上午CRS:MX-PNR:1290689
Fluggeber:Condor Flugdienst/PNR:1290689 Frühbucher 10%inkl。重新发行和转让ab/bis
A025808埃尔伯格先生,乌尔里希62
你可以用

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

详情:

  • ^
    -行的开头
  • \h*
    -0+水平空白
  • F\d{6}
    -
    F
    +6位 -
    *?
    -第一个字符之前的任何0+字符
  • \R{2}
    -2换行符
  • \K
    -并省略整个匹配文本
见:


尝试
preg\u split('~^\h*F\d{6}.*.\R{2}\K~sm',$input)
。看见注意
~sm
修饰符。看,太棒了!你是regex大师:p非常感谢!!有时,同一组的F999999之间会出现换行符(5,6取决于)。比如这里:我应该删除换行符还是有一个正则表达式形式的捕获?试试。再试一次。
$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));