2016-09-22 1 views
1

Kontext: Ich muss eine E-Mail mit mehreren Kunden-Reservierungsdetails teilen, die jeden Tag mit einer Reihe von Regeln empfangen wird. Dies ist ein Beispiel für die E-Mail:.Wenden Sie 2 preg_split mit Regex auf Text an

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

Also im Grunde werden sie hat geschnitten, wenn der letzte F999999 erscheint (wobei 9 eine beliebige Ziffer sein kann), weil F999999 der Reservierungscode ist * I eingefügt, um den Text: «CUT HIER» nur um besser zu verstehen, wo geschnitten werden soll.

* HINWEIS: Buchungscode kann die folgenden Formate haben: F999999, A999999, E999999 oder 999999.

So wende ich einen Arbeits preg_split mit dem folgenden regulären Ausdruck:

Regex1 = "/(?:\\s(F|A|E)?\\d{6}\\s?+.*?\r\n\\s?\r\n)\\K//ms"; 

aber manchmal muss ich schneiden Sie wo «CUT HERE2» erscheint, weil manchmal hinter dem Reservierungscode-Trennzeichen ein Text steht.

Also habe ich diese Regex:

Regex2 = "/^\h*(F|A|E)?\d{6}.*?\R{2}\K/ms" 

Doch ich dieses Format haben manchmal (Zeilenumbrüche zwischen F999999 der gleichen Reservierung), meine früheren regex machen (regex2) geschnitten, wo es heißt «nicht hier CUT »:

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

ich will es nur schneiden, wo «hier» erscheint cUT.

Dieser Fehler tritt zum Beispiel:

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

Ich habe «nicht hier CUT», wo es spaltet aber nicht sollte. Ich setzte: «SOLLTE HIER» schneiden, wo es schneiden sollte. Und ich habe «CUT HIER» gesetzt, wo es richtig schneidet.

+1

Versuchen 'preg_split ('~^\ h * F \ d {6} * \ R {2} \ K ~ sm.?', $ Input)'. Siehe [diese Demo] (https://regex101.com/r/lU2bW6/1). Achten Sie auf "~ sm" Modifikatoren.Siehe https://ideone.com/LGuxuu –

Antwort

1

können Sie verwenden

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

Siehe regex demo

Einzelheiten:

  • ^ - Anfang einer Zeile
  • \h* - 0+ horizontal Whitespaces
  • F\d{6}-F + 6 Stellen - .*? - alle 0+ Zeichen bis zu den ersten
  • \R{2}-2 Zeilenumbrüchen
  • \K - und das ganze Spiel Text weglassen.

Siehe 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)); 
+1

Super! Du bist der Regex-Meister: Vielen Dank !! – Mary

+0

Manchmal gibt es Zeilenumbrüche (5, 6) zwischen F999999 der gleichen Gruppe. wie hier: https://regex101.com/r/lU2bW6/2 – Mary

+0

Sollte ich die Zeilenumbrüche löschen oder gibt es eine Regex-Form der Erfassung? – Mary

Verwandte Themen