Вход Регистрация
Файл: concrete5.7.5.6/concrete/vendor/league/url/src/Components/AbstractSegment.php
Строк: 297
<?php
/**
* This file is part of the League.url library
*
* @license http://opensource.org/licenses/MIT
* @link https://github.com/thephpleague/url/
* @version 3.3.5
* @package League.url
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace LeagueUrlComponents;

use 
ArrayAccess;
use 
InvalidArgumentException;

/**
 *  A class to manipulate URL Segment like components
 *
 *  @package League.url
 *  @since  3.0.0
 */
abstract class AbstractSegment extends AbstractArray implements ArrayAccess
{
    
/**
     * segment delimiter
     *
     * @var string
     */
    
protected $delimiter;

    
/**
     * The Constructor
     * @param mixed $data The data to add
     */
    
public function __construct($data null)
    {
        
$this->set($data);
    }

    
/**
     * {@inheritdoc}
     */
    
public function set($data)
    {
        
$this->data array_filter($this->validate($data), function ($value) {
            return ! 
is_null($value);
        });
    }

    
/**
     * {@inheritdoc}
     */
    
public function __toString()
    {
        return (string) 
$this->get();
    }

    
/**
     * {@inheritdoc}
     */
    
public function getUriComponent()
    {
        return 
$this->__toString();
    }

    
/**
     * {@inheritdoc}
     * @param string|array|Traversable $data the data
     */
    
public function remove($data)
    {
        
$data $this->fetchRemainingSegment($this->data$data);
        if (! 
is_null($data)) {
            
$this->set($data);
        }
    }

    
/**
     * {@inheritdoc}
     */
    
public function sameValueAs(ComponentInterface $component)
    {
        return 
$this->__toString() == $component->__toString();
    }

    
/**
     * Sanitize a string component recursively
     *
     * @param mixed $str
     *
     * @return mixed
     */
    
protected function sanitizeValue($str)
    {
        if (
is_array($str)) {
            foreach (
$str as &$value) {
                
$value $this->sanitizeValue($value);
            }
            unset(
$value);

            return 
$str;
        }

        
$str filter_var((string) $strFILTER_UNSAFE_RAW, array('flags' => FILTER_FLAG_STRIP_LOW));
        
$str trim($str);

        return 
$str;
    }

    
/**
     * ArrayAccess Interface method
     *
     * @param int|string $offset
     * @param mixed      $value
     */
    
public function offsetSet($offset$value)
    {
        
$data $this->data;
        if (
is_null($offset)) {
            
$data[] = $value;
            
$this->set($data);

            return;
        }
        
$offset filter_var($offsetFILTER_VALIDATE_INT, array('min_range' => 0));
        if (
false === $offset) {
            throw new 
InvalidArgumentException('Offset must be an integer');
        }
        
$data[$offset] = $value;
        
$this->set($data);
    }

    
/**
     * Validate a component
     *
     * @param mixed $data the component value to be validate
     *
     * @return array
     *
     * @throws InvalidArgumentException If The data is invalid
     */
    
abstract protected function validate($data);

    
/**
     * {@inheritdoc}
     * @param string|array|Traversable $data
     * @param string                    $whence
     * @param integer                   $whence_index
     */
    
public function append($data$whence null$whence_index null)
    {
        
$this->data $this->appendSegment(
            
$this->data,
            
$this->validate($data),
            
$whence,
            
$whence_index
        
);
    }

    
/**
     * {@inheritdoc}
     * @param string|array|Traversable $data
     * @param string                    $whence
     * @param integer                   $whence_index
     */
    
public function prepend($data$whence null$whence_index null)
    {
        
$this->data $this->prependSegment(
            
$this->data,
            
$this->validate($data),
            
$whence,
            
$whence_index
        
);
    }

    
/**
     * Format removing component labels
     *
     * @param string|array|Traversable $data the component value to be validate
     *
     * @return array
     */
    
protected function formatRemoveSegment($data)
    {
        return 
$this->sanitizeValue($this->validateSegment($data));
    }

    
/**
     * Validate data before insertion into a URL segment based component
     *
     * @param mixed $data the data to insert
     *
     * @return array
     *
     * @throws RuntimeException if the data is not valid
     */
    
protected function validateSegment($data)
    {
        
$delimiter $this->delimiter;

        return 
$this->convertToArray($data, function ($str) use ($delimiter) {
            if (
'' == $str) {
                return array();
            }
            if (
$delimiter == $str[0]) {
                
$str substr($str1);
            }

            return 
explode($delimiter$str);
        });
    }

    
/**
     * Append some data to a given array
     *
     * @param array   $left         the original array
     * @param array   $value        the data to prepend
     * @param string  $whence       the value of the data to prepend before
     * @param integer $whence_index the occurrence index for $whence
     *
     * @return array
     */
    
protected function appendSegment(array $left, array $value$whence null$whence_index null)
    {
        
$right = array();
        if (
null !== $whence && count($found array_keys($left$whence))) {
            
array_reverse($found);
            
$index $found[0];
            if (
array_key_exists($whence_index$found)) {
                
$index $found[$whence_index];
            }
            
$right array_slice($left$index+1);
            
$left array_slice($left0$index+1);
        }

        return 
array_merge($left$value$right);
    }

    
/**
     * Prepend some data to a given array
     *
     * @param array   $right        the original array
     * @param array   $value        the data to prepend
     * @param string  $whence       the value of the data to prepend before
     * @param integer $whence_index the occurrence index for $whence
     *
     * @return array
     */
    
protected function prependSegment(array $right, array $value$whence null$whence_index null)
    {
        
$left = array();
        if (
null !== $whence && count($found array_keys($right$whence))) {
            
$index $found[0];
            if (
array_key_exists($whence_index$found)) {
                
$index $found[$whence_index];
            }
            
$left array_slice($right0$index);
            
$right array_slice($right$index);
        }

        return 
array_merge($left$value$right);
    }

    
/**
     * Remove some data from a given array
     *
     * @param array $data  the original array
     * @param mixed $value the data to be removed (can be an array or a single segment)
     *
     * @return string|null
     *
     * @throws RuntimeException If $value is invalid
     */
    
protected function fetchRemainingSegment(array $data$value)
    {
        
$segment implode($this->delimiter$data);
        if (
'' == $value) {
            if (
$index array_search(''$datatrue)) {
                
$left array_slice($data0$index);
                
$right array_slice($data$index+1);

                return 
implode($this->delimiterarray_merge($left$right));
            }

            return 
$segment;
        }

        
$part implode($this->delimiter$this->formatRemoveSegment($value));

        
$regexStart '@(:?^|\'.$this->delimiter.')';

        if (! preg_match($regexStart.preg_quote($part, '
@').'@', $segment, $matches, PREG_OFFSET_CAPTURE)) {
            return null;
        }

        $pos = $matches[0][1];

        return substr($segment, 0, $pos).substr($segment, $pos + strlen($part) + 1);
    }
}
Онлайн: 0
Реклама