2016-09-15 7 views
1

ich Daten in diesem Format haben:regex bekommen alles außer letzte Wort und bis finden Sie einen Text

1 DOPPEL TYP I MEERBLICK   HALBPENSION 
FRÜHBUCHER 20% 
INKL. REISELEITUNG UND TRANSFER AB/BIS 
FLUGHAFEN 
KEIN INFO-TREFFEN IM HOTEL! REISELEITUNG IST TELEFONISCH ZU ERREICHEN UND AUF ANFRAGE 
F367655 HERR WILKAT, CHRISTINE       O 05.01.15 
F367655 HERR LEBEDIES, HANS-JOACHIM      O 05.01.15 

Und ich möchte erfassen: 1 und DOPPEL TYP I MEERBLICK und alle Text zwischen "FFRUHBUCHER .." und "ANFRAGE" (also F367655 ist der Endbegrenzer) als verschiedene Übereinstimmungen. aber ich habe diese regex, die erfasst: 1 und Halbpension:

$re = "/\\s(\\d{1})(\\w+\\W{1,2})*/"; 
$str = " 1 DOPPEL TYP I MEERBLICK   HALBPENSION\n FRÜHBUCHER 20%\n INKL. REISELEITUNG UND TRANSFER AB/BIS\n FLUGHAFEN\n KEIN INFO-TREFFEN IM HOTEL! REISELEITUNG IST TELEFONISCH ZU ERREICHEN UND AUF ANFRAGE\n F367655 HERR WILKAT, CHRISTINE       O 05.01.15\n F367655 HERR LEBEDIES, HANS-JOACHIM      O 05.01.15"; 

preg_match_all($re, $str, $matches); 

Ich teste hier: Regex101

Anstatt also das letzte Wort der Erfassung („HALPENSION“) ich alles außer letzte Wort erfassen möchten . Und auch was nach Halbpension (vielleicht anderes Wort) und vor so etwas wie F367655 ("Frühbucher 20% INKL. Reiseleitung UND TRANSFER AB/BIS FLUGHAFEN KEINER INFO-TREFFEN IM HOTEL! Reiseleitung IST TELEFONISCH ZU ERREICHEN UND AUF ANFRAGE").

Ich habe mehrere Lösungen versucht, aber ich bekomme es nicht zur Arbeit.

Vielen Dank im Voraus, für Ihre Hilfe!

+0

Nicht sicher, was Sie brauchen, versuchen Sie [ ' '~^\ s * (\ d) \ s * (. +?) \ s * \ b \ w + $ ~ ''] (https://regex101.com/r/zP1wM7/2). Das wird Capture * '1' und' DOPPEL TYP I MEERBLICK'. –

+0

Verwenden Sie '(\ w + \ W {1,2}) *'. Dies wird alles außer dem letzten Wort erfassen. –

+0

Danke, funktioniert aber wenn ich Text nach doesnot habe. Sorry vergessen zu setzen – Mary

Antwort

1

Sie können Capture die ersten und zweiten Werte mit einem preg_match das folgende Muster verwenden:

'~^\s*(\d+)\s*(.*\S) .*\R((?s:.*?))\R\h*F\d{6}~um' 

Siehe regex demo

Einzelheiten:

  • ^ - Beginn Zeichenfolge
  • \s* - 0+ führende Whitespaces
  • (\d+) - Gruppe 1 1+ Ziffern
  • \s* Erfassung - 0+ Whitespaces
  • (.*\S) - Gruppe 2 Capturing 0+ irgendwelche Zeichen, sondern ein Newline so viele wie möglich bis zum letzten nicht-Leerzeichen (einschließlich) und
  • \h-1 horizontaler Leerraum (nicht in Gruppe 2)
  • .* - der Rest der Zeile
  • \R - ein Zeilenumbruch
  • ((?s:.*?)) - Gruppe 3 Capturing 0+ alle Zeichen so wenig wie möglich bis zum ersten
  • \R\h*F\d{6} - Zeilenumbruch, 0+ horizontal Leerzeichen, F und 6 Stellen.

Siehe PHP demo:

$str = " 1 DOPPEL TYP I MEERBLICK   HALBPENSION\n FRÜHBUCHER 20%\n INKL. REISELEITUNG UND TRANSFER AB/BIS\n FLUGHAFEN\n KEIN INFO-TREFFEN IM HOTEL! REISELEITUNG IST TELEFONISCH ZU ERREICHEN UND AUF ANFRAGE\n F367655 HERR WILKAT, CHRISTINE       O 05.01.15\n F367655 HERR LEBEDIES, HANS-JOACHIM      O 05.01.15"; 
preg_match('~^\s*(\d+)\s*(.*\S) .*\R((?s:.*?))\R\h*F\d{6}~um', $str, $m); 
array_shift($m); 
print_r($m); 
+0

Danke, funktioniert aber wenn ich Text nach doesnot habe. Sorry vergessen zu setzen – Mary

+1

Wie [''~^\ s * (\ d +) \ s * (. * \ S) ~''] (https://regex101.com/r/rFuuP7/1)? –

+0

ja danke, und was ist nach HALBPENSION (vielleicht ein anderes Wort) und vor etwas wie F999999 zu erfassen? Vielen Dank!! – Mary

0

könnten Sie gehen für:

<?php 

$string = ' 1 DOPPEL TYP I MEERBLICK   HALBPENSION'; 
$regex = '~^\D*(\d+)\h*((?:(?!\h{2,}).)+)~'; 
preg_match_all($regex, $string, $matches); 
print_r($matches); 

?> 

$matches[1] wird die Zahl, $matches[2] die DOPPELTYP I MEERBLICK finden a demo on ideone.com sowie on regex101.com halten.

+0

Danke, funktioniert aber wenn ich Text nach doesnot habe. Sorry vergessen zu setzen – Mary

0
$str = ' 1 DOPPEL TYP I MEERBLICK   HALBPENSION'; 
$str = preg_replace('/\s\s+/', ' ', $str); 
$array=explode(' ',$str); 
$count=count($array); 
$text=''; 
for($i=0;$i<$count-1;$i++){ 
    if($text!='')$text.=' '; 
$text.=$array[$i]; 

} 
echo $text; 

$text geben Ausgang wie 1 DOPPEL TYP I MEERBLICK bitte versuchen Sie es,

Verwandte Themen