0

在过去的一个小时里,我一直在搜索以前的问题,所以如果这存在于其他地方,对不起,但我没有找到它。我对 PHP 很陌生,所以如果这是一个新手问题,请原谅我。我也通过谷歌搜索。

我正在尝试自动从 airnav.com 获取各个机场的纬度/经度信息以进行地图更新。我有一个带有机场代码的 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

我似乎找不到任何方法来解决这个问题。有谁知道怎么了?

4

2 回答 2

1

你只是假设 preg_match 确实找到了一些东西,然后盲目地向前闯入,即使实际上没有匹配。

尝试

if (preg_match(...)) {
    $lat = $arptmatch[1];
    $long = $arptmatch[2];
} else {
    $lat = 'n/a';
    $long = 'n/a';
}

反而。

于 2013-10-21T21:36:05.050 回答
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,}也可以写成+

于 2013-10-21T21:59:47.360 回答