0

過去 1 時間、以前の質問を検索していたので、これが別の場所にある場合は申し訳ありませんが、見つかりませんでした。私は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 

サイトにアクセスして確認すると、どちらが正しいですか。しかし、2 番目の空港については、次のようになります。

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。正規表現の 2 番目の部分は1162 ~ 2 文字にする必要があります{2,2}。2 ~ 3 文字に一致するように変更し{2,3}ます。米国の座標のみを使用している場合、{2,3} は機能しますが、米国以外では、1 桁の整数部分を持つ座標に遭遇する可能性があります。{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 に答える