регулярное выражение получить все, кроме последнего слова и пока не найти текст

У меня есть данные в этом формате:

  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 TRANSFER AB / BIS
FLUGHAFEN
KEIN INFO-TREFFEN IM ОТЕЛЬ! REISELEITUNG IST TELEFONISCH ZU ERREICHEN UNUF ANFRAGE «).

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

Заранее спасибо за вашу помощь!

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} — разрыв строки, 0+ горизонтальных пробелов, F и 6 цифр.

Увидеть PHP демо:

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

Другие решения

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

<?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, увидеть демо на ideone.com так же как на regex101.com.

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
пожалуйста, попробуй,

0
По вопросам рекламы [email protected]