У меня есть данные в этом формате:
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 «).
Я пробовал несколько решений, но я не получаю его на работу.
Заранее спасибо за вашу помощь!
Вы можете захватить первое и второе значения с 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);
Вы могли бы пойти на:
<?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.
$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
пожалуйста, попробуй,