【问题标题】:PHP Regex for IP to Location APIIP 到位置 API 的 PHP 正则表达式
【发布时间】:2011-03-08 18:01:28
【问题描述】:

我将如何使用 Regex 获取关于 IP 到 Location API 的信息

这是 API

http://ipinfodb.com/ip_query.php?ip=74.125.45.100

我需要获取国家名称、地区/州和城市。

我试过了:

$ip = $_SERVER["REMOTE_ADDR"];
$contents = @file_get_contents('http://ipinfodb.com/ip_query.php?ip=' . $ip . '');
$pattern = "/<CountryName>(.*)<CountryName>/";
preg_match($pattern, $contents, $regex);
$regex = !empty($regex[1]) ? $regex[1] : "FAIL";
echo $regex;

当我执行 echo $regex 时,我总是失败,我该如何解决这个问题

【问题讨论】:

    标签: php xml regex api geoip


    【解决方案1】:

    您最好使用 XML 解析器来提取信息。

    例如,this script 会将其解析为数组。

    Regex 真的不应该用于解析 HTML 或 XML。

    【讨论】:

      【解决方案2】:

      正如亚伦建议的那样。最好不要重新发明轮子,所以尝试用 simplexml_load_string() 解析它

      // Init the CURL
      $curl = curl_init();
      
      // Setup the curl settings
      curl_setopt($curl, CURLOPT_URL, $url);
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 0);
      
      // grab the XML file
      $raw_xml = curl_exec($curl);
      
      curl_close($curl);
      
      // Setup the xml object
      $xml = simplexml_load_string( $raw_xml );
      

      您现在可以将 $xml 变量的任何部分作为对象访问,这里是您发布的示例。

      <Response> 
          <Ip>74.125.45.100</Ip> 
          <Status>OK</Status> 
          <CountryCode>US</CountryCode> 
          <CountryName>United States</CountryName> 
          <RegionCode>06</RegionCode> 
          <RegionName>California</RegionName> 
          <City>Mountain View</City> 
          <ZipPostalCode>94043</ZipPostalCode> 
          <Latitude>37.4192</Latitude> 
          <Longitude>-122.057</Longitude> 
          <Timezone>0</Timezone> 
          <Gmtoffset>0</Gmtoffset> 
          <Dstoffset>0</Dstoffset> 
      </Response> 
      

      现在,当您将此 XML 字符串加载到 simplexml_load_string() 中后,您可以像这样访问响应的 IP 地址。

      $xml->IP;
      

      simplexml_load_string() 会将格式良好的 XML 文件转换为您可以操作的对象。我唯一能说的就是去尝试一下并玩一下

      编辑:

      来源 http://www.php.net/manual/en/function.simplexml-load-string.php

      【讨论】:

      • 或者简单地说:$xml = simplexml_load_file($url);
      • Semantics ;-) 这是我唯一真正的工作示例
      【解决方案3】:

      如果你真的需要使用正则表达式,那么你应该更正你正在使用的那个。 "|&lt;CountryName&gt;([^&lt;]*)&lt;/CountryName&gt;|i" 会更好。

      【讨论】:

      • 正如其他人报告的那样,如果不是在某些特定情况下,我宁愿不使用正则表达式来解析 HTML、XHTML 或 XML。我必须快速验证返回的 XML 内容是否包含标签,并且我使用了正则表达式;对于其他情况,如果返回的 XML 不太大,最好使用 SimpleXML。
      猜你喜欢
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 2020-09-11
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多