diff --git a/system/src/Grav/Common/Helpers/Excerpts.php b/system/src/Grav/Common/Helpers/Excerpts.php index 03b4e32cd..15edec749 100644 --- a/system/src/Grav/Common/Helpers/Excerpts.php +++ b/system/src/Grav/Common/Helpers/Excerpts.php @@ -12,6 +12,7 @@ use Grav\Common\Grav; use Grav\Common\Page\Page; use Grav\Common\Uri; use Grav\Common\Page\Medium\Medium; +use Grav\Common\Utils; use RocketTheme\Toolbox\Event\Event; use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator; @@ -321,7 +322,7 @@ class Excerpts */ protected static function parseUrl($url) { - $url_parts = parse_url($url); + $url_parts = Utils::multibyteParseUrl($url); if (isset($url_parts['scheme'])) { /** @var UniformResourceLocator $locator */ diff --git a/system/src/Grav/Common/Utils.php b/system/src/Grav/Common/Utils.php index 3e5bdcde6..b4743774e 100644 --- a/system/src/Grav/Common/Utils.php +++ b/system/src/Grav/Common/Utils.php @@ -997,4 +997,36 @@ abstract class Utils return intval($size); } } + + /** + * Multibyte-safe Parse URL function + * + * @param $url + * @return mixed + */ + public static function multibyteParseUrl($url) + { + $enc_url = preg_replace_callback( + '%[^:/@?&=#]+%usD', + function ($matches) + { + return urlencode($matches[0]); + }, + $url + ); + + $parts = parse_url($enc_url); + + if($parts === false) + { + throw new \InvalidArgumentException('Malformed URL: ' . $url); + } + + foreach($parts as $name => $value) + { + $parts[$name] = urldecode($value); + } + + return $parts; + } }