Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.
   1  <?php
   2  
   3  /**

   4   * Parses a URI into the components and fragment identifier as specified

   5   * by RFC 3986.

   6   */
   7  class HTMLPurifier_URIParser
   8  {
   9  
  10      /**

  11       * Instance of HTMLPurifier_PercentEncoder to do normalization with.

  12       */
  13      protected $percentEncoder;
  14  
  15      public function __construct()
  16      {
  17          $this->percentEncoder = new HTMLPurifier_PercentEncoder();
  18      }
  19  
  20      /**

  21       * Parses a URI.

  22       * @param $uri string URI to parse

  23       * @return HTMLPurifier_URI representation of URI. This representation has

  24       *         not been validated yet and may not conform to RFC.

  25       */
  26      public function parse($uri)
  27      {
  28          $uri = $this->percentEncoder->normalize($uri);
  29  
  30          // Regexp is as per Appendix B.

  31          // Note that ["<>] are an addition to the RFC's recommended

  32          // characters, because they represent external delimeters.

  33          $r_URI = '!'.
  34              '(([a-zA-Z0-9\.\+\-]+):)?'. // 2. Scheme
  35              '(//([^/?#"<>]*))?'. // 4. Authority
  36              '([^?#"<>]*)'.       // 5. Path
  37              '(\?([^#"<>]*))?'.   // 7. Query
  38              '(#([^"<>]*))?'.     // 8. Fragment
  39              '!';
  40  
  41          $matches = array();
  42          $result = preg_match($r_URI, $uri, $matches);
  43  
  44          if (!$result) return false; // *really* invalid URI

  45  
  46          // seperate out parts

  47          $scheme     = !empty($matches[1]) ? $matches[2] : null;
  48          $authority  = !empty($matches[3]) ? $matches[4] : null;
  49          $path       = $matches[5]; // always present, can be empty

  50          $query      = !empty($matches[6]) ? $matches[7] : null;
  51          $fragment   = !empty($matches[8]) ? $matches[9] : null;
  52  
  53          // further parse authority

  54          if ($authority !== null) {
  55              $r_authority = "/^((.+?)@)?(\[[^\]]+\]|[^:]*)(:(\d*))?/";
  56              $matches = array();
  57              preg_match($r_authority, $authority, $matches);
  58              $userinfo   = !empty($matches[1]) ? $matches[2] : null;
  59              $host       = !empty($matches[3]) ? $matches[3] : '';
  60              $port       = !empty($matches[4]) ? (int) $matches[5] : null;
  61          } else {
  62              $port = $host = $userinfo = null;
  63          }
  64  
  65          return new HTMLPurifier_URI(
  66              $scheme, $userinfo, $host, $port, $path, $query, $fragment);
  67      }
  68  
  69  }
  70  
  71  // vim: et sw=4 sts=4