2013-10-31 128 views
1

我试图匹配E)“列”的所有内容。正则表达式,不同的结束字符串

A1147/13 NOTAMN 
Q) ESAA/QRRCH/IV/BO /AW/000/023/5933N01746E002 
A) ESSA B) 1311140900 C) 1311211500 
D) 14 21 0900-1500 
E) UPPER LIMIT ES R16C KUNGSANGEN RAISED TO 2300 FT AMSL 
REF AIP ENR 5.1 
F) GND G) 2300FT AMSL 
CREATED: 30 Oct 2013 10:00:00 
SOURCE: EUECYIYN 

使用正则表达式如下:

preg_match_all('/E\)(.*)(?=F\))/is', $string, $output); 

我已经成功地获取数据,但只只要F)列上存在,其中它不总是这样。有时它结束就像:

A1147/13 NOTAMN 
Q) ESAA/QRRCH/IV/BO /AW/000/023/5933N01746E002 
A) ESSA B) 1311140900 C) 1311211500 
D) 14 21 0900-1500 
E) UPPER LIMIT ES R16C KUNGSANGEN RAISED TO 2300 FT AMSL 
REF AIP ENR 5.1 
CREATED: 30 Oct 2013 10:00:00 
SOURCE: EUECYIYN 

如何解决这个问题?


编辑: 这是我要回部分:

UPPER LIMIT ES R16C KUNGSANGEN RAISED TO 2300 FT AMSL 
REF AIP ENR 5.1 

它要么与列的开始F)或创建的文本结束。

回答

2

我会建议使用哈姆扎的方法,用少许其他的调整:

E\)(.*?)(?=F\)|$) 

regex101 demo

您也可以尝试的东西像这样,虽然处理时间可能稍长:

如果你想匹配,直到

regex101 demo

(?:(?!F\)).)+将匹配除了F)

什么,你可以很容易地将它添加到正则表达式:

E\)((?:(?!F\)|CREATED:).)+) 
+0

最后一部分解决了它!大演示网站,我不知道那个! :) –

1

不要使用DOTALL和使用复线:

/^E\).*$/im 
+1

[E_DOESN'T_WORK(HTTP: //regex101.com/r/hC0qX7) – HamZa

+0

@HamZa:它确实可以在你的演示中通过匹配:'E)UPPER LIMIT ES R16C KUNGSANGEN提升到2300 FT AMSL' – anubhava

+0

嗯,它不清楚在问题,但我解释为匹配,直到'SOURCE:EUECYIYN' - 我可能是错误的 – HamZa

相关问题