2016-09-15 7 views
1

У меня есть данные в следующем формате:регулярного выражения получить все, кроме последнего слова и до найти какой-нибудь текст

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 

И я хочу, чтобы захватить: 1 и Doppel TYP I Meerblick и весь текст между «FFRUHBUCHER ..» и «ANFRAGE» (так F367655 - это конечный разделитель) как разные совпадения. Однако у меня есть это регулярное выражение, которое захватывает: 1 и 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); 

Я проверяю здесь: Regex101

Так вместо того, чтобы захватить последнее слово («HALPENSION») Я хочу, чтобы захватить все, кроме последнего слова , А также, Что после HALBPENSION (может быть другое слово) и перед чем-то вроде F367655 ("FRÜHBUCHER 20% Inkl. REISELEITUNG UND ПЕРЕДАЧА AB/BIS FLUGHAFEN KEIN INFO-Treffen IM HOTEL! REISELEITUNG IST TELEFONISCH ZU ERREICHEN UND AUF Anfrage").

Я пробовал несколько решений, но я не получаю его на работу.

Заранее благодарю вас за помощь!

+0

Не уверен, что вам нужно, попробуйте [ ' '~^\ с * (\ d) \ S * (. +?) \ S * \ Ъ \ W + $ ~ ' '] (https://regex101.com/r/zP1wM7/2). Это будет * захват * '1' и' DOPPEL TYP I MEERBLICK'. –

+0

use '(\ w + \ W {1,2}) *'. Это будет захватывать все, кроме последнего слова. –

+0

Спасибо, работает, но если у меня есть текст после donot. Извините, забыл поставить – Mary

ответ

1

Вы можете захват первое и второе значения с preg_match, используя следующую закономерность:

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

Смотрите regex demo

Детали:

  • ^ - начало строка
  • \s* - 0+ ведущих пробельных символов
  • (\d+) - Группа 1 захватывая 1+ цифры
  • \s* - 0+ пробельных символы
  • (.*\S) - Группа 2 отлова 0+ любые символы, но перевод строки как можно больше до последнего непробельные (в том числе) и
  • \h - 1 горизонтальных пробельный (не внутри группы 2)
  • .* - остальная частью линии
  • \R - линия перерыв
  • ((?s:.*?)) - Группа 3 отлов 0+ любые символы, как можно до первого
  • \R\h*F\d{6} - LineBreak, 0+ горизонтальные пробелы, F и 6 цифр.

См 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

Спасибо, работает, но если у меня есть текст после doesnot. Извините, забыл положить – Mary

+1

Как ['' ~^\ s * (\ d +) \ s * (. * \ S) ~ ''] (https://regex101.com/r/rF0uP7/1)? –

+0

Да, спасибо, и чтобы захватить что-то после HALBPENSION (возможно, другое слово) и перед чем-то вроде F999999? Благодаря!! – Mary

0

Вы могли бы пойти:

<?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] будет содержать номер, $matches[2]DOPPELTYP I MEERBLICK см a demo on ideone.com, а также on regex101.com.

+0

Спасибо, работает, но если у меня есть текст после donot. Извините, забыл положить – 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 дают выход как 1 Doppel TYP I Meerblick пожалуйста, попробуйте,