我同意安德烈亚斯的观点 - 通常问题出现在要求基于正则表达式的解决方案上,而不考虑或知道使用非正则表达式方法的可能性。我会敦促你考虑使用非正则表达式的解决方案,只要它不是无理地复杂化就可以这么做。 “
此外,我还看到要求 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