code: private static function parseDecimalMinutesWithCardinalLetters(string $string, Ellipsoid $ellipsoid = null)
      {
          // Decimal minutes with cardinal letters, e. g. "52 12.345, 13 23.456",
          // "52° 12.345, 13° 23.456", "52° 12.345′, 13° 23.456′", "52 12.345 N, 13 23.456 E",
          // "N52° 12.345′ E13° 23.456′"
          $regexp = '/([NS]?\s*)(\d{1,2})°?\s+(\d{1,2}\.?\d*)[\'′]?(\s*[NS]?)';
          $regexp .= '[, ]\s*([EW]?\s*)(\d{1,3})°?\s+(\d{1,2}\.?\d*)[\'′]?(\s*[EW]?)/ui';
  
          if (preg_match($regexp, $string, $match) === 1) {
              $latitude = (int)$match[2] + (float)$match[3] / 60;
              if (strtoupper(trim($match[1])) === 'S' || strtoupper(trim($match[4])) === 'S') {
                  $latitude = - $latitude;
              }
              $longitude = (int)$match[6] + (float)$match[7] / 60;
              if (strtoupper(trim($match[5])) === 'W' || strtoupper(trim($match[8])) === 'W') {
                  $longitude = - $longitude;
              }
  
              return new Coordinate((float)$latitude, (float)$longitude, $ellipsoid);
          }
  
          return null;
      }
docs: @param string $string
  @param Ellipsoid $ellipsoid
  
  @return Coordinate|null
  @throws InvalidArgumentException