3v4l.org

run code in 300+ PHP versions simultaneously
<?php /** * PHP URI Library * * A PHP library for working with URI's. Requires PHP 5.3.7 or later. Replaces * and extends PHP's parse_url() * * Originally inspired by P Guardiario's work. * * @author Nicholas Jordon * @link https://github.com/ProjectCleverWeb/PHP-URI * @copyright 2014 Nicholas Jordon - All Rights Reserved * @version 1.0.0 RC2 * @license http://opensource.org/licenses/MIT * @see http://en.wikipedia.org/wiki/URI_scheme */ namespace {class uri extends \uri\main{}}namespace uri{abstract class main{ public $error; public $input; private $object; private $chain; private $authority; private $domain; private $fqdn; private $fragment; private $host; private $protocol; private $pass; private $password; private $path; private $port; private $query; private $scheme; private $scheme_name; private $scheme_symbols; private $user; private $username; public function __construct($input){$this->input=$input;$this->object=\uri\parser::parse($input);if(!empty($this->object->host)){\uri\generate::authority($this->object);\uri\generate::aliases($this->object);$this->chain=new \uri\chain($this->object);$this->authority=&$this->object->authority;$this->domain=&$this->object->domain;$this->fqdn=&$this->object->fqdn;$this->fragment=&$this->object->fragment;$this->host=&$this->object->host;$this->protocol=&$this->object->protocol;$this->pass=&$this->object->pass;$this->password=&$this->object->password;$this->path=&$this->object->path;$this->port=&$this->object->port;$this->query=&$this->object->query;$this->scheme=&$this->object->scheme;$this->scheme_name=&$this->object->scheme_name;$this->scheme_symbols=&$this->object->scheme_symbols;$this->user=&$this->object->user;$this->username=&$this->object->username;}else {$this->error='Input could not be parsed as a URI';}} public function __toString(){return \uri\generate::string($this->object);} public function __invoke(){return \uri\generate::string($this->object);} public function __get($name){if(isset($this->object->$name)){\uri\generate::scheme($this->object);\uri\generate::authority($this->object);return $this->object->$name;}else {$this->_err('UNDEFINED',debug_backtrace(),$name);return NULL;}} public function __set($name,$value){if(isset($this->object->$name)&&$name!='authority'){\uri\actions::modify($this->object,'replace',$name,$value);return $value;}else {$this->_err('FORBIDDEN',debug_backtrace(),$name);return NULL;}} public function __isset($name){\uri\generate::scheme($this->object);\uri\generate::authority($this->object);return !empty($this->object->$name);} public function __unset($name){if(isset($this->object->$name)&&$name!='host'&&$name!='authority'){\uri\actions::modify($this->object,'replace',$name,'');return TRUE;}elseif(isset($this->object->$name)){$this->_err('FORBIDDEN',debug_backtrace(),$name);}else {$this->_err('UNDEFINED',debug_backtrace(),$name);}return FALSE;} public function str(){return \uri\generate::string($this->object);} public function to_string(){return \uri\generate::string($this->object);} public function p_str(){echo \uri\generate::string($this->object);} public function arr(){$arr=array('authority'=>$this->object->authority,'fragment'=>$this->object->fragment,'host'=>$this->object->host,'pass'=>$this->object->pass,'path'=>$this->object->path,'port'=>$this->object->port,'query'=>$this->object->query,'scheme'=>$this->object->scheme,'scheme_name'=>$this->object->scheme_name,'scheme_symbols'=>$this->object->scheme_symbols,'user'=>$this->object->user,);$arr['domain']=&$arr['host'];$arr['fqdn']=&$arr['host'];$arr['password']=&$arr['pass'];$arr['protocol']=&$arr['scheme'];$arr['username']=&$arr['user'];ksort($arr);return $arr;} public function to_array(){return $this->arr();} public function path_info(){return \uri\generate::path_info($this->object);} public function query_arr(){return \uri\generate::query_array($this->object);} public function replace($section,$str){return \uri\actions::modify($this->object,'replace',$section,$str);} public function prepend($section,$str){return \uri\actions::modify($this->object,'prepend',$section,$str);} public function append($section,$str){return \uri\actions::modify($this->object,'append',$section,$str);} public function query_add($key,$value){return \uri\query::add($this->object,$key,$value);} public function query_replace($key,$value){\uri\query::replace($this->object,$key,$value);} public function query_remove($key){\uri\query::remove($this->object,$key);} public function query_exists($key){return \uri\query::exists($this->object,$key);} public function query_get($key){return \uri\query::get($this->object,$key);} public function query_rename($key,$new_key){return \uri\query::rename($this->object,$key,$new_key);} public function chain(){return $this->chain;} public function reset(){$this->__construct($this->input);} private function _err($type,$trace,$name){$fmt='Undifined property via <code>%1$s::%2$s()</code>: Property <code>%3$s</code> cannot be unset in <b>%4$s</b> on line <b>%5$s</b>. Error triggered';if($type=='FORBIDDEN'){$fmt='Forbidden property via <code>%1$s::%2$s()</code>: Property <code>%3$s</code> cannot be unset in <b>%4$s</b> on line <b>%5$s</b>. Error triggered';}trigger_error(sprintf($fmt,$trace[0]['class'],$trace[0]['function'],$name,$trace[0]['file'],$trace[0]['line']),E_USER_NOTICE);}}class parser{const REGEX='/^(([a-z]+)?(\:\/\/|\:|\/\/))?(?:([a-z0-9$_\.\+!\*\'\(\),;&=\-]+)(?:\:([a-z0-9$_\.\+!\*\'\(\),;&=\-]*))?@)?((?:\d{3}.\d{3}.\d{3}.\d{3})|(?:[a-z0-9\-_]+(?:\.[a-z0-9\-_]+)*))(?:\:([0-9]+))?((?:\:|\/)[a-z0-9\-_\/\.]+)?(?:\?([a-z0-9$_\.\+!\*\'\(\),;:@&=\-%]*))?(?:#([a-z0-9\-_]*))?/i'; public static function parse($uri){if(!is_string($uri)){return FALSE;}$parsed=self::regex_parse($uri);if(empty($parsed)){$parsed=array_fill(1,10,'');}return (object)array('scheme'=>$parsed[1],'scheme_name'=>$parsed[2],'scheme_symbols'=>$parsed[3],'user'=>$parsed[4],'pass'=>$parsed[5],'host'=>$parsed[6],'port'=>$parsed[7],'path'=>$parsed[8],'query'=>$parsed[9],'fragment'=>$parsed[10],);} private static function regex_parse($uri){preg_match_all(self::REGEX,$uri,$parsed,PREG_SET_ORDER);if(!isset($parsed[0][6])){return FALSE;}return $parsed[0]+array_fill(0,11,'');}}class modify{ public static function scheme_name(&$object,$action,$str){$org=$object->scheme_name;\uri\actions::callback($object,$action,__FUNCTION__,$str);if(!(preg_match('/\A[a-z]{1,10}\Z/',$object->scheme_name)||empty($str))){$object->scheme_name=$org;return FALSE;}elseif(empty($object->scheme_symbols)){$object->scheme_symbols='://';}return \uri\generate::string($object);} public static function scheme_symbols(&$object,$action,$str){$org=$object->scheme_symbols;\uri\actions::callback($object,$action,__FUNCTION__,$str);if(!(preg_match('/\A(:)?([\/]{2,3})?\Z/',$object->scheme_symbols)||empty($str))){$object->scheme_symbols=$org;return FALSE;}return \uri\generate::string($object);} public static function scheme(&$object,$action,$str){$org=array($object->scheme,$object->scheme_name,$object->scheme_symbols);\uri\actions::callback($object,$action,__FUNCTION__,$str);if(empty($object->scheme)){$object->scheme=$object->scheme_name=$object->scheme_symbols='';}else {preg_match('/\A([a-z]{1,10})?(\:|:\/\/|\/\/|:\/\/\/)\Z/i',$object->scheme,$matches);if(empty($matches[1])&&empty($matches[2])){$object->scheme=$org[0];$object->scheme_name=$org[1];$object->scheme_symbols=$org[2];return FALSE;}else {$matches=$matches+array('','','');$object->scheme=$matches[0];$object->scheme_name=$matches[1];$object->scheme_symbols=$matches[2];}}return \uri\generate::string($object);} public static function protocol(&$object,$action,$str){return self::scheme($object,$action,$str);} public static function user(&$object,$action,$str){$str=rawurlencode($str);\uri\actions::callback($object,$action,__FUNCTION__,$str);return \uri\generate::string($object);} public static function username(&$object,$action,$str){return self::user($object,$action,$str);} public static function pass(&$object,$action,$str){$str=rawurlencode($str);\uri\actions::callback($object,$action,__FUNCTION__,$str);return \uri\generate::string($object);} public static function password(&$object,$action,$str){return self::pass($object,$action,$str);} public static function host(&$object,$action,$str){$org=$object->host;\uri\actions::callback($object,$action,__FUNCTION__,$str);if((!preg_match('/\A(([a-z0-9_]([a-z0-9\-_]+)?)\.)+[a-z0-9]([a-z0-9\-]+)?\Z/i',$object->host)&&!preg_match('/\A([0-9]\.){3}[0-9]\Z/i',$object->host))){$object->host=$org;return FALSE;}return \uri\generate::string($object);} public static function domain(&$object,$action,$str){return self::host($object,$action,$str);} public static function fqdn(&$object,$action,$str){return self::host($object,$action,$str);} public static function port(&$object,$action,$str){$org=$object->port;if(isset($str[0])&&$str[0]==':'){$str=substr($str,1);}\uri\actions::callback($object,$action,__FUNCTION__,$str);if(!(preg_match('/\A[0-9]{0,5}\Z/',$object->port)||empty($str))){$object->port=$org;return FALSE;}return \uri\generate::string($object);} public static function path(&$object,$action,$str){\uri\actions::callback($object,$action,__FUNCTION__,$str);return \uri\generate::string($object);} public static function query(&$object,$action,$str){if(isset($str[0])&&$str[0]=='?'){$str=substr($str,1);}\uri\actions::callback($object,$action,__FUNCTION__,$str);return \uri\generate::string($object);} public static function fragment(&$object,$action,$str){if(isset($str[0])&&$str[0]=='#'){$str=substr($str,1);}$str=urlencode($str);\uri\actions::callback($object,$action,__FUNCTION__,$str);return \uri\generate::string($object);}}class actions{ public static function modify(&$object,$action,$section,$str){settype($section,'string');settype($str,'string');$section=strtolower($section);if(is_callable(array('\\uri\\modify',$section))){return call_user_func_array(array('\\uri\\modify',$section),array(&$object,$action,$str));}else {return FALSE;}} public static function callback(&$object,$action,$section,$str){switch($action){case 'replace':$object->$section=$str;break;case 'prepend':$object->$section=$str.$object->$section;break;case 'append':$object->$section=$object->$section.$str;}}}class generate{ public static function aliases(&$object){$object->protocol=&$object->scheme;$object->username=&$object->user;$object->password=&$object->pass;$object->domain=&$object->host;$object->fqdn=&$object->host;} public static function scheme(&$object){$object->scheme=$object->scheme_name.$object->scheme_symbols;} public static function authority(&$object){$str_arr=array($object->user);if(empty($object->user)==FALSE&&empty($object->pass)){$str_arr[]='@';}elseif(!empty($object->user)){$str_arr[]=':'.$object->pass.'@';}$str_arr[]=$object->host;if(!empty($object->port)){$str_arr[]=':'.$object->port;}$object->authority=implode('',$str_arr);} public static function string(&$object){self::scheme($object);self::authority($object);$str_arr=array($object->scheme,$object->authority,$object->path);if(!empty($object->query)){$str_arr[]='?'.$object->query;}if(!empty($object->fragment)){$str_arr[]='#'.$object->fragment;}return implode('',$str_arr);} public static function path_info(&$object){$defaults=array('dirname'=>'','basename'=>'','extension'=>'','filename'=>'','array'=>array());$info=pathinfo($object->path)+$defaults;$info['array']=array_values(array_filter(explode('/',$object->path)));ksort($info);return $info;} public static function query_array(&$object){parse_str($object->query,$return);return (array)$return;}}class query{ public static function add(&$object,$key,$value){$qarray=\uri\generate::query_array($object);} public static function replace(&$object,$key,$value){$qarray=\uri\generate::query_array($object);} public static function remove(&$object,$key){$qarray=\uri\generate::query_array($object);} public static function exists(&$object,$key){$qarray=\uri\generate::query_array($object);} public static function get(&$object,$key){$qarray=\uri\generate::query_array($object);} public static function rename(&$object,$key,$new_key){$qarray=\uri\generate::query_array($object);}}class chain{ private $object; public function __construct(&$object){$this->object=&$object;return $this;} public function p_str(){echo \uri\generate::string($this->object);return $this;} public function replace($section,$str){\uri\actions::modify($this->object,'replace',$section,$str);return $this;} public function prepend($section,$str){\uri\actions::modify($this->object,'prepend',$section,$str);return $this;} public function append($section,$str){\uri\actions::modify($this->object,'append',$section,$str);return $this;}}}
Output for 8.0.0 - 8.0.30, 8.1.0 - 8.1.27, 8.2.0 - 8.2.17, 8.3.0 - 8.3.4
Fatal error: Uncaught Error: Class "uri\main" not found in /in/Bg0hc:18 Stack trace: #0 {main} thrown in /in/Bg0hc on line 18
Process exited with code 255.
Output for 5.3.0 - 5.3.29, 5.4.0 - 5.4.45, 5.5.0 - 5.5.38, 5.6.0 - 5.6.40, 7.0.0 - 7.0.33, 7.1.0 - 7.1.33, 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33

preferences:
282.89 ms | 403 KiB | 399 Q