我一直在搜索过去一小时的先前问题,所以如果这个问题存在于其他地方,抱歉,但我没有找到它。我是PHP的新手,所以请原谅我这是一个新手问题。我也在谷歌搜索过。
我正在尝试自动从airnav.com获取各种机场的lat / long信息以进行地图更新。我有一个带有机场代码的XML文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AIRPORTS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<AIRPORT>MXA</AIRPORT>
<AIRPORT>SDM</AIRPORT>
</AIRPORTS>
我的PHP是:
<?php
$xml=simplexml_load_file("airports.xml");
foreach($xml->AIRPORT as $arpt)
{
if (preg_match('#[0-9]#', $arpt)){
$arptName = $arpt;}
else{
$arptName = "K" . $arpt;}
$content = file_get_contents("http://www.airnav.com/airport/" . $arptName);
preg_match('#([0-9]{2,2}\.[0-9]{1,})\s\/\s(\-[0-9]{2,2}\.[0-9]{1,})#', $content, $arptmatch);
$lat = $arptmatch[1]; //ERROR HERE (line 27)
$long = $arptmatch[2]; //AND HERE (line 28)
echo "Airport: $arpt\nLat: $lat\nLong: $long\n";
}
?>
这对第一个机场来说效果很好,我明白了:
Airport: MXA Lat: 35.8944444 Long: -90.1545833
当我去网站检查是正确的时候。但对于第二个机场,我得到了:
Airport: SDM Lat: Long:
以下错误:
Notice: Undefined offset: 1 in /home/a5308473/public_html/phpStuff/readFromAirNav.html on line 27
Notice: Undefined offset: 2 in /home/a5308473/public_html/phpStuff/readFromAirNav.html on line 28
我似乎无法找到解决此问题的方法。谁知道什么是错的?
答案 0 :(得分:1)
你只是假设preg_match找到了一些东西,并且盲目地向前闯入,即使实际上没有匹配。
尝试
if (preg_match(...)) {
$lat = $arptmatch[1];
$long = $arptmatch[2];
} else {
$lat = 'n/a';
$long = 'n/a';
}
代替。
答案 1 :(得分:0)
这是因为SDM的坐标是32.5722722 / -116.9801611
。在正则表达式的第二部分中,116
必须介于2到2个字符{2,2}
之间。更改它以匹配2到3个字符{2,3}
。如果您只使用美国坐标,那么{2,3}将起作用,但在美国之外,您可能遇到具有单个数字整数部分的坐标。 {1,3}
将与任何经度的整数部分匹配,{1,2}
将匹配任何纬度的整数部分。
你的正则表达式应该是
([0-9]{1,2}\.[0-9]{1,})\s\/\s(\-[0-9]{1,3}\.[0-9]{1,})
因为你的正则表达式与任何东西都不匹配,所以结果是一个0长度的数组,你的索引偏移量大于数组的长度。
此外,{2,2}
可以写为{2}
,{1,}
可以写为+