用于匹配经纬度函数的正则表达式
RegEx for matching latitude and longitude function
我的文件中有纬度和经度数据,我正试图通过 convertor function 调用它。
我正在尝试为 $result60
行添加功能,但它不起作用。我正在尝试为函数传递值,因此它会使用 DM 方法计算正确的纬度和经度。
尝试
$re60 = '/([EW])([0-9][0-9][0-9])([0-9][0-9])/s';
$str60 = 'E16130';
//$subst60 = '\3\2\1';
$subst60 = DMS2Decimal($degr = \2, $mins = \3, $secs = 0, $dir = \1);
$result60 = preg_replace($re60, $subst60, $str60);
echo "The result of the substitution is ".$result60;
我该如何解决这个问题?
您可以使用 this RegEx 将您的输入字符串分成 3 组,其中组 </code>、<code>
和 </code> 可以通过您的 DMS 方法调用以 return <code>$decimal
。
正则表达式
/([EWSN])([0-9]{3})([0-9]{2})/s
代码
$str60 = 'E16130';
preg_match_all('/([EWSN])([0-9]{3})([0-9]{2})/s', $str60, $matches);
$result60 = DMS2Decimal($degrees = (int) $matches[2][0], $minutes = (int) $matches[3][0], $seconds = 10, $direction = strtolower($matches[1][0]));
echo "The result of the substitution: y: " . $result60;
function DMS2Decimal($degrees = 0, $minutes = 0, $seconds = 0, $direction = 'n')
{
//converts DMS coordinates to decimal
//returns false on bad inputs, decimal on success
//direction must be n, s, e or w, case-insensitive
$d = strtolower($direction);
$ok = array('n', 's', 'e', 'w');
//degrees must be integer between 0 and 180
if (!is_numeric($degrees) || $degrees < 0 || $degrees > 180) {
$decimal = false;
}
//minutes must be integer or float between 0 and 59
elseif (!is_numeric($minutes) || $minutes < 0 || $minutes > 59) {
$decimal = false;
}
//seconds must be integer or float between 0 and 59
elseif (!is_numeric($seconds) || $seconds < 0 || $seconds > 59) {
$decimal = false;
} elseif (!in_array($d, $ok)) {
$decimal = false;
} else {
//inputs clean, calculate
$decimal = $degrees + ($minutes / 60) + ($seconds / 3600);
//reverse for south or west coordinates; north is assumed
if ($d == 's' || $d == 'w') {
$decimal *= -1;
}
}
return $decimal;
}
输出
The result of the substitution: y: 161.5027777777
我的文件中有纬度和经度数据,我正试图通过 convertor function 调用它。
我正在尝试为 $result60
行添加功能,但它不起作用。我正在尝试为函数传递值,因此它会使用 DM 方法计算正确的纬度和经度。
尝试
$re60 = '/([EW])([0-9][0-9][0-9])([0-9][0-9])/s';
$str60 = 'E16130';
//$subst60 = '\3\2\1';
$subst60 = DMS2Decimal($degr = \2, $mins = \3, $secs = 0, $dir = \1);
$result60 = preg_replace($re60, $subst60, $str60);
echo "The result of the substitution is ".$result60;
我该如何解决这个问题?
您可以使用 this RegEx 将您的输入字符串分成 3 组,其中组 </code>、<code>
和 </code> 可以通过您的 DMS 方法调用以 return <code>$decimal
。
正则表达式
/([EWSN])([0-9]{3})([0-9]{2})/s
代码
$str60 = 'E16130';
preg_match_all('/([EWSN])([0-9]{3})([0-9]{2})/s', $str60, $matches);
$result60 = DMS2Decimal($degrees = (int) $matches[2][0], $minutes = (int) $matches[3][0], $seconds = 10, $direction = strtolower($matches[1][0]));
echo "The result of the substitution: y: " . $result60;
function DMS2Decimal($degrees = 0, $minutes = 0, $seconds = 0, $direction = 'n')
{
//converts DMS coordinates to decimal
//returns false on bad inputs, decimal on success
//direction must be n, s, e or w, case-insensitive
$d = strtolower($direction);
$ok = array('n', 's', 'e', 'w');
//degrees must be integer between 0 and 180
if (!is_numeric($degrees) || $degrees < 0 || $degrees > 180) {
$decimal = false;
}
//minutes must be integer or float between 0 and 59
elseif (!is_numeric($minutes) || $minutes < 0 || $minutes > 59) {
$decimal = false;
}
//seconds must be integer or float between 0 and 59
elseif (!is_numeric($seconds) || $seconds < 0 || $seconds > 59) {
$decimal = false;
} elseif (!in_array($d, $ok)) {
$decimal = false;
} else {
//inputs clean, calculate
$decimal = $degrees + ($minutes / 60) + ($seconds / 3600);
//reverse for south or west coordinates; north is assumed
if ($d == 's' || $d == 'w') {
$decimal *= -1;
}
}
return $decimal;
}
输出
The result of the substitution: y: 161.5027777777