我有这种格式的数据:
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ÜHBUCHER20%”) INKL。 REISELEITUNG UND TRANSFER AB / BIS FLUGHAFEN KEIN INFO-TREFFEN IM HOTEL! REISELEITUNG IST TELEFONISCH ZU ERREICHEN UND AUF ANFRAGE“)。
我尝试了几种解决方案,但我没有让它发挥作用。
提前感谢您的帮助!
答案 0 :(得分:1)
您可以使用以下模式使用preg_match
捕获第一个和第二个值:
'~^\s*(\d+)\s*(.*\S) .*\R((?s:.*?))\R\h*F\d{6}~um'
请参阅regex demo
<强>详情:
^
- 字符串开头\s*
- 0+领先的空白(\d+)
- 第1组捕获1+位数\s*
- 0+ whitespaces (.*\S)
- 第2组捕获0 +任何字符,但新行尽可能多,直到最后一个非空格(包括)和\h
- 1个水平空格(不在第2组内).*
- 其余部分\R
- 换行符((?s:.*?))
- 第3组在第一个\R\h*F\d{6}
- 换行符,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);
答案 1 :(得分: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。
答案 2 :(得分: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
请试试,