我同意安德烈亞斯的觀點 - 通常問題出現在要求基於正則表達式的解決方案上,而不考慮或知道使用非正則表達式方法的可能性。我會敦促你考慮使用非正則表達式的解決方案,只要它不是無理地複雜化就可以這麼做。 「
此外,我還看到要求 preg_match_all()
」拆分字符串「的問題 - 大多數情況下,這不是基於正則表達式拆分的最佳功能。使用正則表達式分割字符串的php函數是preg_split()
。
因爲你的分隔符是靜態的(TEMPO
),這個問題可以按理說應該使用非正則表達式的功能來解決。然而,正則表達式解決方案可能是您個人偏好的一個未指定的原因(方便,代碼簡潔,未來修改等)。
這些都是一些preg_split()
方法:
$in='VHHH 020218Z 0202/0306 20010KT 9999 FEW015 SCT025 TX32/0206Z TX32/0306Z TN27/0222Z TEMPO 0202/0209 2500 -TSRA SHRA FEW010CB SCT015 TEMPO 0215/0221 3500 SHRA FEW015CB SCT020 TEMPO 0221/0303 2500 -TSRA SHRA FEW010CB SCT015 TEMPO 0303/0306 3500 SHRA FEW015CB SCT020=';
var_export(array_slice(preg_split('/ TEMPO /',$in),1));
輸出:
array (
0 => '0202/0209 2500 -TSRA SHRA FEW010CB SCT015',
1 => '0215/0221 3500 SHRA FEW015CB SCT020',
2 => '0221/0303 2500 -TSRA SHRA FEW010CB SCT015',
3 => '0303/0306 3500 SHRA FEW015CB SCT020=',
)
我的方法將運行約10倍比RIZWAN的preg_match_all()
方法快。
Andreas的樣本......
$TAF = "VHHH 020218Z 0202/0306 20010KT 9999 FEW015 SCT025 TX32/0206Z TX32/0306Z TN27/0222Z TEMPO 0202/0209 2500 -TSRA SHRA FEW010CB SCT015 TEMPO 0215/0221 3500 SHRA FEW015CB SCT020 TEMPO 0221/0303 2500 -TSRA SHRA FEW010CB SCT015 TEMPO 0303/0306 3500 SHRA FEW015CB SCT020 PROB40 0211/0212 SHRA BKN025CB BECMG 0212/0214 25015G27KT TEMPO 0202/0209 2500 -TSRA SHRA FEW010CB SCT015 FM1430 25015G27KT OVC020 SHRA=";
$delims=['TEMPO','BECMG','PROB','FM'];
var_export(array_slice(preg_split('/ (?='.implode('|',$delims).')/',$TAF),1));
輸出:
array (
0 => 'TEMPO 0202/0209 2500 -TSRA SHRA FEW010CB SCT015',
1 => 'TEMPO 0215/0221 3500 SHRA FEW015CB SCT020',
2 => 'TEMPO 0221/0303 2500 -TSRA SHRA FEW010CB SCT015',
3 => 'TEMPO 0303/0306 3500 SHRA FEW015CB SCT020',
4 => 'PROB40 0211/0212 SHRA BKN025CB',
5 => 'BECMG 0212/0214 25015G27KT',
6 => 'TEMPO 0202/0209 2500 -TSRA SHRA FEW010CB SCT015',
7 => 'FM1430 25015G27KT OVC020 SHRA=',
)
附:我沒有處理機場天氣狀況的網頁。
我可以建議你看看http://www.alexander-ott.com/phpmyeasyweather/它不是100%兼容新版本的PHP,但它很容易修復。它將處理大部分的METAR和TAFs – Andreas
TAF是由它構成還是真實的?在相同的TAF中,能見度10公里 - > 2500米。不要以爲我在 – Andreas
之前就已經看到這個答案了嗎? – Andreas