Вы не можете выполнять арифметику при обычной замене регулярных выражений, но вы можете написать функцию обратного вызова и использовать preg_replace_callback.
function matches_to_decimal($matches) {
return $matches[2] + ($matches[3]/60);
}
$inputString = "N47° 30.5951'";
$resultDecimal = preg_replace_callback('/(N|S)(\d+)° (\d+\.?\d*)\'/',
"matches_to_decimal",
$inputString);
Кстати, широта и долгота обычно записываются как 47 ° 30'35 "с.ш., 123 ° 56'12" з.д., поэтому вы можете соответствующим образом настроить регулярное выражение и функцию обратного вызова.