我有这个字符串:
City Lat/Lon: (50.7708) / (6.1053)
我尝试用 php 中的 sscanf 这样提取这两个数字:
$result = post_request('http://www.ip-address.org/lookup/ip-locator.php', $post_data);
$start =strpos($result['content'], "City Lat/Lon");
$end = strpos($result['content'], "IP Language");
$sub = substr($result['content'],$start,$end-$start);
sscanf($sub, "City Lat/Lon: (%f) / (6.1053)",$asd);
echo $asd;
但它没有给我任何结果或错误我应该改变什么?
这样就可以了
sscanf("City Lat/Lon: (50.7708) / (6.1053)", "City Lat/Lon: (%f) / (%f)",$asd,$wer);
看来您正在使用
post_request()
在here找到的功能。
如果是这样,您的
$sub
变量包含在响应中找到的各种 HTML 标签。例如,如果您尝试:
var_dump($sub) // Outputs: string 'City Lat/Lon:</th><td class='lookup'> (50.7708) / (6.1053)</td></tr><tr><th>' (length=78)
代替 sscanf,您可以尝试使用正则表达式来匹配纬度和经度(如 @Headshota 所建议)。例如一种可能的解决方案:
//...
preg_match('#\((?<lat>-?[0-9.]+)\) / \((?<lon>-?[0-9.]+)\)#', $sub, $matches);
echo $matches["lat"]; // Outputs 50.7708
echo $matches["lon"]; // Outputs 6.1053
对我有用:
$sub = 'City Lat/Lon: (50.7708) / (6.1053)';
var_dump( sscanf($sub, "City Lat/Lon: (%f) / (6.1053)",$asd), $asd);
...打印:
int(1)
float(50.7708)
错误可能出现在您的确切测试代码中或其他地方。
使用正则表达式:
preg_match_all("/(\([0-9.]+\))/");
这将返回一个包含您的值的数组。