Last active
May 18, 2016 15:27
-
-
Save lsloan/749dc3bf2afcb62f90017bb87bbbcd7c to your computer and use it in GitHub Desktop.
A String class for PHP, downloaded from: https://code.google.com/archive/p/php-string/downloads (Specifically: https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/php-string/string.php)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| // Downloaded from: https://code.google.com/archive/p/php-string/downloads | |
| // (Specifically: https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/php-string/string.php) | |
| /** | |
| * String class for PHP that provides convenient methods for handling multibyte strings. | |
| * | |
| * The class supports the extensions mbstring and iconv, and the package | |
| * PHP-UTF8. It chooses the best available function for each method. | |
| * In addition, it provides many new methods. Some of them are: | |
| * substringBetween, splice, startWith, endsWith and squeeze. It is | |
| * also possible to use PHP internal functions, or custom functions, | |
| * to manipulate the string. | |
| */ | |
| /** | |
| * Represents a string. | |
| */ | |
| class String implements Iterator, ArrayAccess, Countable | |
| { | |
| /** | |
| * Literal string. | |
| * @var string | |
| */ | |
| private $_string = ''; | |
| /** | |
| * String's encoding. | |
| * @var string uppercase | |
| */ | |
| private $_encoding = null; | |
| /** | |
| * String's length. | |
| * @var int | |
| */ | |
| private $_length = null; | |
| /** | |
| * Current position (Iterator). | |
| * @var int | |
| */ | |
| private $_index = 0; | |
| /** | |
| * Default string encoding. Will be used if no encoding is specified. | |
| * Value can changed at run-time with the static method {@link setDefaultEncoding()}. | |
| * Use null for auto-detection of encoding. | |
| * @var string | |
| */ | |
| private static $_defaultEncoding = null; | |
| private static $_caseSensitive = true; | |
| /** | |
| * Whether the mbstring extension is installed and loaded. | |
| * @access private | |
| * @var bool | |
| */ | |
| private static $_extMbstring = null; | |
| /** | |
| * Whether the iconv extension is installed and loaded. | |
| * @access private | |
| * @var bool | |
| */ | |
| private static $_extIconv = null; | |
| /** | |
| * Whether the utf8 package is installed and loaded. | |
| * @access private | |
| * @var bool | |
| */ | |
| private static $_extUtf8 = null; | |
| const ALPHA = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; | |
| const ALNUM = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; | |
| const NUMERIC = '0123456789'; | |
| const SPACE = ' '; | |
| /** | |
| * Overload method. Proxies to {@link callback()}. | |
| * Example: | |
| * <code> | |
| * <?php | |
| * $string = new String('123456'); | |
| * echo $string->md5(); // prints: e10adc3949ba59abbe56e057f20f883e | |
| * ?> | |
| * </code> | |
| * @param mixed $name | |
| * @param array $args | |
| * @return mixed | |
| * @throws BadFunctionCallException | |
| */ | |
| public function __call($name, $args) | |
| { | |
| return $this->callback($name, $args); | |
| } | |
| /** | |
| * Constructs a string object. | |
| * @param string $string literal string | |
| * @param string $encoding string encoding (default null, auto-detection) | |
| * @return String | |
| */ | |
| public function __construct($string = '', $encoding = null) | |
| { | |
| $this->_string = (string)$string; | |
| if ($encoding !== null) { | |
| $this->_encoding = strtoupper(str_replace(' ', '-', (string)$encoding)); | |
| } else if (self::$_defaultEncoding !== null) { | |
| $this->_encoding = self::$_defaultEncoding; | |
| } | |
| } | |
| /** | |
| * Overload method. Provides length and encoding properties. | |
| * Example: | |
| * <code> | |
| * <?php | |
| * $string = new String('123456'); | |
| * echo $string->getLength(); // prints: 6 | |
| * echo $string->length; // prints: 6 | |
| * ?> | |
| * </code> | |
| * @param string $key | |
| * @return mixed | |
| * @throws BadMethodCallException | |
| */ | |
| public function __get($key) | |
| { | |
| $key = strtolower($key); | |
| if ($key === 'length') { | |
| return $this->getLength(); | |
| } | |
| if ($key === 'encoding') { | |
| return $this->getEncoding(); | |
| } | |
| throw new BadMethodCallException('Undefined property.'); | |
| } | |
| /** | |
| * Overload method. Returns the literal value of the string. | |
| * Useful for string operations like printing and concatenation. | |
| * For other uses, it is possible to use {@link toString()}. | |
| * Example: | |
| * <code> | |
| * <?php | |
| * $string = new String('123456'); | |
| * echo $string; // prints: 123456 | |
| * ?> | |
| * </code> | |
| * @return string | |
| */ | |
| public function __toString() | |
| { | |
| return $this->_string; | |
| } | |
| /** | |
| * Returns the result of the callback function $name. | |
| * The literal string will be sent as the first argument. | |
| * @param mixed $name callback function | |
| * @param array $args additional function arguments (default empty) | |
| * @return mixed | |
| * @throws BadFunctionCallException | |
| * @see http://php.net/manual/en/language.pseudo-types.php#language.types.callback | |
| */ | |
| public function callback($name, array $args = array()) | |
| { | |
| if (!is_callable($name)) { | |
| throw new BadFunctionCallException('$name is not a valid callback.'); | |
| } | |
| array_unshift($args, $this->_string); | |
| $result = call_user_func_array($name, $args); | |
| if (!is_string($result)) { | |
| return $result; | |
| } | |
| return new self($result); | |
| } | |
| /** | |
| * Capitalizes a string. | |
| * Changes the first letter to uppercase. | |
| * Example: | |
| * <code> | |
| * <?php | |
| * $string = new String('aBc'); | |
| * echo $string->capitalize(); // prints: ABc | |
| * ?> | |
| * </code> | |
| * @return String | |
| */ | |
| public function capitalize() | |
| { | |
| if (function_exists('mb_ucfirst')) { | |
| $string = mb_ucfirst($this->_string, $this->getEncoding()); | |
| } else if (function_exists('mb_substr')) { | |
| $encoding = $this->getEncoding(); | |
| $string = mb_strtoupper(mb_substr($this->_string, 0, 1, $encoding), $encoding) . | |
| mb_substr($this->_string, 1, null, $encoding); | |
| } else { | |
| $string = ucfirst($this->_string); | |
| } | |
| return new self($string); | |
| } | |
| /** | |
| * Returns the character at index $index, counting from zero. | |
| * If the index doesn't exists, returns null. | |
| * @param int $index character index, counting from zero. | |
| * @return String | |
| */ | |
| public function charAt($index) | |
| { | |
| return $this->substring($index, 1); | |
| } | |
| /** | |
| * Compares this string to the provided string. | |
| * Returns positive number if this string is greater than $string, | |
| * negative number if this string is less than $string, | |
| * and 0 in case the strings are equal. | |
| * This method is case-sensitive. See also {@link compareToIgnoreCase()} | |
| * @param string | |
| * @param int $characters upper limit of characters to use in comparison (default null) | |
| * @return int | |
| */ | |
| public function compareTo($string, $characters = null) | |
| { | |
| if ($characters === null) { | |
| return strcmp($this->_string, (string)$string); | |
| } | |
| return strncmp($this->_string, (string)$string, (int)$characters); | |
| } | |
| /** | |
| * Similar to {@link compareTo()}, but case-insensitive. | |
| * @param string $string | |
| * @param int $characters upper limit of characters to use in comparison (default null) | |
| * @return int | |
| */ | |
| public function compareToIgnoreCase($string, $characters = null) | |
| { | |
| if ($characters === null) { | |
| return strncasecmp($this->_string, (string)$string); | |
| } | |
| return strncasecmp($this->_string, (string)$string, (int)$characters); | |
| } | |
| /** | |
| * Concats a string and returns the new one. | |
| * Actually, it is the same as the dot operator. | |
| * @param string $string | |
| * @return String | |
| */ | |
| public function concat($string) | |
| { | |
| return new self($this->_string.(string)$string); | |
| } | |
| /** | |
| * Checks if the string contains a substring. | |
| * @param string $substr | |
| * @return bool true if the string contains $substr | |
| */ | |
| public function contains($substr) | |
| { | |
| return ($this->indexOf($substr) !== false); | |
| } | |
| /** | |
| * Counts the number of characters in the string. | |
| * Alias of {@link getLength()}. Intended to use with count(). | |
| * Example: | |
| * <code> | |
| * <?php | |
| * $string = new String('123456'); | |
| * echo $string->getLength(); // prints: 6 | |
| * echo count($string); // prints: 6 | |
| * ?> | |
| * </code> | |
| * @return int | |
| */ | |
| public function count() | |
| { | |
| return $this->getLength(); | |
| } | |
| /** | |
| * Returns the current element. | |
| * @return String | |
| */ | |
| public function current() | |
| { | |
| return $this->charAt($this->_index); | |
| } | |
| /** | |
| * Checks if the string ends with a substring. | |
| * @param string $substr substring | |
| * @return bool true if the string ends with $substr. | |
| */ | |
| public function endsWith($substr) | |
| { | |
| $substr = new self($substr); | |
| return ($this->lastIndexOf($substr) === $this->length() - $substr->length()); | |
| } | |
| /** | |
| * Checks is this string is equal to the provided string. | |
| * This method is case-sensitive. See also {@link equalsIgnoreCase()} | |
| * @param string $string | |
| * @return bool true if the strings are equal | |
| */ | |
| public function equals($string) | |
| { | |
| return ($this->compareTo($string) === 0); | |
| } | |
| /** | |
| * Similar to {@link equals()}, but case-insensitive. | |
| * @param string $string | |
| * @return bool true if the strings are equal | |
| */ | |
| public function equalsIgnoreCase($string) | |
| { | |
| return ($this->compareToIgnoreCase($string) === 0); | |
| } | |
| /** | |
| * Returns String's encoding, or false in failure. | |
| * @return string|bool | |
| */ | |
| public function getEncoding() | |
| { | |
| if ($this->_encoding === null) { | |
| if (function_exists('mb_detect_encoding')) { | |
| $this->_encoding = mb_detect_encoding($this->_string); | |
| } else if (function_exists('utf8_compliant') && utf8_compliant($this->_string)) { | |
| $this->_encoding = 'UTF-8'; | |
| } else { | |
| $this->_encoding = false; | |
| } | |
| } | |
| return $this->_encoding; | |
| } | |
| /** | |
| * Returns string's length. | |
| * Counts the number of characters in the string. | |
| * Example: | |
| * <code> | |
| * <?php | |
| * $string = new String('123456'); | |
| * echo $string->getLength(); // prints: 6 | |
| * ?> | |
| * </code> | |
| * @return int | |
| */ | |
| public function getLength() | |
| { | |
| if ($this->_length === null) { | |
| if (function_exists('mb_strlen')) { | |
| $this->_length = (int)mb_strlen($this->_string, $this->getEncoding()); | |
| } else if ($this->getEncoding() === 'UTF-8' && function_exists('utf8_strlen')) { | |
| $this->_length = (int)utf8_strlen($this->_string); | |
| } else if (function_exists('iconv_strlen')) { | |
| $this->_length = (int)iconv_strlen($this->_string, $this->getEncoding()); | |
| } else { | |
| $this->_length = (int)strlen($this->_string); | |
| } | |
| } | |
| return $this->_length; | |
| } | |
| /** | |
| * Returns the index of the first occurance of $substr in the string. | |
| * In case $substr is not a substring of the string, returns false. | |
| * @param String $substr substring | |
| * @param int $offset | |
| * @return int|bool | |
| */ | |
| public function indexOf($substr, $offset = 0) | |
| { | |
| if (function_exists('mb_strpos')) { | |
| $pos = mb_strpos($this->_string, (string)$substr, (int)$offset, $this->getEncoding()); | |
| } else if ($this->getEncoding() === 'UTF-8' && function_exists('utf8_strpos')) { | |
| $pos = utf8_strpos($this->_string, (string)$substr, ($offset === 0 ? null : $offset)); | |
| } else if (function_exists('iconv_strpos')) { | |
| $pos = iconv_strpos($this->_string, (string)$substr, (int)$offset, $this->getEncoding()); | |
| } else { | |
| $pos = strpos($this->_string, (string)$substr, (int)$offset); | |
| } | |
| return $pos; | |
| } | |
| public function insert($offset, $string) | |
| { | |
| return $this->splice($offset, 0, $string); | |
| } | |
| /** | |
| * Checks if the string is empty or whitespace-only. | |
| * @return bool true if the string is blank | |
| */ | |
| public function isBlank() | |
| { | |
| return ($this->trim()->_string === ''); | |
| } | |
| /** | |
| * Checks if the string is empty. | |
| * @return bool true if the string is empty | |
| */ | |
| public function isEmpty() | |
| { | |
| return ($this->_string === ''); | |
| } | |
| /** | |
| * Checks if the string is lower case. | |
| * String is considered lower case if all the characters are lower case. | |
| * @return bool true if the string is lower case | |
| */ | |
| public function isLowerCase() | |
| { | |
| return $this->equals($this->toLowerCase()); | |
| } | |
| /** | |
| * Checks if the string is not empty or whitespace-only. | |
| * @return bool true if the string is not blank | |
| */ | |
| public function isNotBlank() | |
| { | |
| return ($this->trim()->_string !== ''); | |
| } | |
| /** | |
| * Checks if the string is not empty. | |
| * @return bool true if the string is not empty | |
| */ | |
| public function isNotEmpty() | |
| { | |
| return ($this->_string !== ''); | |
| } | |
| /** | |
| * Checks if the string is palindrome. | |
| * @return bool true if the string is palindrome | |
| */ | |
| public function isPalindrome() | |
| { | |
| return ($this->equals($this->reverse())); | |
| } | |
| /** | |
| * Checks is the string is unicase. | |
| * Unicase string is one that has no case for its letters. | |
| * @return bool true if the string is unicase | |
| */ | |
| public function isUnicase() | |
| { | |
| return $this->toLowerCase()->equals($this->toUpperCase()); | |
| } | |
| /** | |
| * Checks if the string is upper case. | |
| * String is considered upper case if all the characters are upper case. | |
| * @return bool true if the string is upper case | |
| */ | |
| public function isUpperCase() | |
| { | |
| return $this->equals($this->toUpperCase()); | |
| } | |
| /** | |
| * Return the key of the current element. | |
| * @return int | |
| */ | |
| public function key() | |
| { | |
| return $this->_index; | |
| } | |
| /** | |
| * Returns the index of the last occurance of $substr in the string. | |
| * In case $substr is not a substring of the string, returns false. | |
| * @param String $substr substring | |
| * @param int $offset | |
| * @return int|bool | |
| */ | |
| public function lastIndexOf($substr, $offset = 0) | |
| { | |
| if (function_exists('mb_strrpos')) { | |
| $pos = mb_strrpos($this->_string, (string)$substr, (int)$offset, $this->getEncoding()); | |
| } else if ($this->getEncoding() === 'UTF-8' && function_exists('utf8_strrpos')) { | |
| $pos = utf8_strrpos($this->_string, (string)$substr, ($offset === 0 ? null : $offset)); | |
| } else if (function_exists('iconv_strrpos')) { | |
| $pos = iconv_strrpos($this->_string, (string)$substr, (int)$offset, $this->getEncoding()); | |
| } else { | |
| $pos = strrpos($this->_string, (string)$substr, (int)$offset); | |
| } | |
| return $pos; | |
| } | |
| /** | |
| * Returns the leftmost $length characters of a string. | |
| * @param int $length number of characters. | |
| * @return String | |
| */ | |
| public function left($length) | |
| { | |
| return $this->substring(0, $length); | |
| } | |
| public function matches($pattern) | |
| { | |
| return preg_match((string)$pattern, $this->_string); | |
| } | |
| public function naturalCompareTo($string) | |
| { | |
| return strnatcmp($this->_string, (string)$string); | |
| } | |
| public function naturalCompareToIgnoreCase($string) | |
| { | |
| return strnatcasecmp($this->_string, (string)$string); | |
| } | |
| /** | |
| * Move forward to next element. | |
| */ | |
| public function next() | |
| { | |
| ++$this->_index; | |
| } | |
| /** | |
| * Checks if the string contains character at $offset. | |
| * Example: | |
| * <code> | |
| * <?php | |
| * $string = new String('example'); | |
| * var_dump(isset($string[2])); // prints: bool(true) | |
| * ?> | |
| * </code> | |
| * @param int $offset character index, counting from zero. | |
| * @return bool | |
| */ | |
| public function offsetExists($offset) | |
| { | |
| return ($offset >= 0 && $offset < $this->length()); | |
| } | |
| /** | |
| * Provides array access for accessing characters. | |
| * Example: | |
| * <code> | |
| * <?php | |
| * $string = new String('offsetGet'); | |
| * echo $string[3]; // prints: s | |
| * ?> | |
| * </code> | |
| * @param int $offset character index, counting from zero. | |
| * @uses String::charAt | |
| * @return String | |
| */ | |
| public function offsetGet($offset) | |
| { | |
| return $this->charAt($offset); | |
| } | |
| /** | |
| * String is immutable. Calling this method will result in an exception. | |
| * @param int $offset | |
| * @param string $value | |
| * @throws BadMethodCallException | |
| */ | |
| public function offsetSet($offset, $value) | |
| { | |
| throw BadMethodCallException(); | |
| } | |
| /** | |
| * String is immutable. Calling this method will result in an exception. | |
| * @param int $offset | |
| * @param string $value | |
| * @throws BadMethodCallException | |
| */ | |
| public function offsetUnset($offset) | |
| { | |
| throw BadMethodCallException(); | |
| } | |
| /** | |
| * Overlays part of a String with another String. | |
| */ | |
| public function overlay($string, $start, $end) | |
| { | |
| } | |
| public function pad($length, $padding = self::SPACE) | |
| { | |
| $func = (($this->getEncoding() === 'UTF-8' && function_exists('utf8_str_pad')) ? 'utf8_str_pad' : 'str_pad'); | |
| return new self($func($this->_string, (int)$length, (string)$padding, STR_PAD_BOTH)); | |
| } | |
| public function padEnd($length, $padding = self::SPACE) | |
| { | |
| $func = (($this->getEncoding() === 'UTF-8' && function_exists('utf8_str_pad')) ? 'utf8_str_pad' : 'str_pad'); | |
| return new self($func($this->_string, (int)$length, (string)$padding, STR_PAD_RIGHT)); | |
| } | |
| public function padStart($length, $padding = self::SPACE) | |
| { | |
| $func = (($this->getEncoding() === 'UTF-8' && function_exists('utf8_str_pad')) ? 'utf8_str_pad' : 'str_pad'); | |
| return new self($func($this->_string, (int)$length, (string)$padding, STR_PAD_LEFT)); | |
| } | |
| /** | |
| * Removes all occurrences of a substring from the string. | |
| * @param string $substr substring | |
| * @param bool $regex whether $substr is a regular expression | |
| * @return String | |
| */ | |
| public function remove($substr) | |
| { | |
| return $this->replace($substr, ''); | |
| } | |
| public function removeDuplicates($substr) | |
| { | |
| $pattern = '/('.preg_quote($substr, '/').')+/'; | |
| return $this->replaceRegex($pattern, $substr); | |
| } | |
| /** | |
| * Removes first occurrence of a substring from the string. | |
| * @param string $substr substring | |
| * @param bool $regex whether $substr is a regular expression | |
| * @return String | |
| */ | |
| public function removeOnce($substr) | |
| { | |
| return $this->removeRegex($substr, 1); | |
| } | |
| public function removeRegex($pattern, $limit = null) | |
| { | |
| $this->replaceRegex($pattern, '', $limit); | |
| } | |
| public function removeSpaces() | |
| { | |
| return $this->remove(array(" ", "\r", "\n", "\t", "\0", "\x0B")); | |
| } | |
| /** | |
| * Repeats the string $multiplier times. | |
| * If seperator is not null, it will seperate the repeated string. | |
| * @param int $multiplier number of times the string should be repeated. | |
| * @param String $separator | |
| * @return String | |
| */ | |
| public function repeat($multiplier, $separator = null) | |
| { | |
| if ($multiplier === 0) { | |
| $string = ''; | |
| } else if ($separator === null) { | |
| $string = str_repeat($this->_string, $multiplier); | |
| } else { | |
| $string = str_repeat($this->_string.(string)$separator, $multiplier - 1) . $this->_string; | |
| } | |
| return new self($string); | |
| } | |
| public function replace($search, $replace) | |
| { | |
| $string = str_replace($search, $replace, $this->_string); | |
| return new self($string); | |
| } | |
| public function replaceOnce($search, $replace) | |
| { | |
| return $this->replaceRegex($search, $replace, 1); | |
| } | |
| public function replaceRegex($search, $replace, $limit = null) | |
| { | |
| $limit = (($limit === null) ? -1 : (int)$limit); | |
| $string = preg_replace($search, $replace, $this->_string, $limit); | |
| return new self($string); | |
| } | |
| /** | |
| * Revereses a string. | |
| * @return String | |
| */ | |
| public function reverse() | |
| { | |
| if ($this->getEncoding() === 'UTF-8' && function_exists('utf8_strrev')) { | |
| $string = utf8_strrev($this->_string); | |
| } else { | |
| $string = strrev($this->_string); | |
| } | |
| return new self($string); | |
| } | |
| /** | |
| * Rewind the Iterator to the first element. | |
| */ | |
| public function rewind() | |
| { | |
| $this->_index = 0; | |
| } | |
| /** | |
| * Returns the rightmost $length characters of a string. | |
| * @param int $length number of characters. | |
| * @return String | |
| */ | |
| public function right($length) | |
| { | |
| return $this->substring(-$length); | |
| } | |
| /** | |
| * Shuffles a string randomly. | |
| * One permutation of all possible is created. | |
| * @return String | |
| */ | |
| public function shuffle() | |
| { | |
| return new self(str_shuffle($this->_string)); | |
| } | |
| /** | |
| * Removes a part of the string and replace it with something else. | |
| * Example: | |
| * <code> | |
| * $string = new String('The fox jumped over the lazy dog.'); | |
| * echo $string->splice(4, 0, 'quick brown '); | |
| * </code> | |
| * prints 'The quick brown fox jumped over the lazy dog.' | |
| * @return String | |
| */ | |
| public function splice($offset, $length = null, $replacement = '') | |
| { | |
| $count = $this->length(); | |
| // Offset handling (negative values measure from end of string) | |
| if ($offset < 0) { | |
| $offset += $count; | |
| } | |
| // Length handling (positive values measure from $offset; negative, from end of string; omitted = end of string) | |
| if ($length === null) { | |
| $length = $count; | |
| } else if ($length < 0) { | |
| $length += $count - $offset; | |
| } | |
| return new self($this->substring(0, $offset) . | |
| (string)$replacement . | |
| $this->substring($offset + $length) | |
| ); | |
| } | |
| public function split($delimiter) | |
| { | |
| $array = explode($delimiter, $this->_string); | |
| return $array; | |
| } | |
| public function splitRegex($pattern) | |
| { | |
| $array = preg_split($pattern, $this->_string); | |
| return $array; | |
| } | |
| /** | |
| * Removes extra spaces and reduces string's length. | |
| * Extra spaces are repeated, leading or trailing spaces. | |
| * It will also convert all spaces to white-spaces. | |
| * @return String | |
| */ | |
| public function squeeze() | |
| { | |
| return $this | |
| ->replace(array("\r\n", "\r", "\n", "\t", "\0", "\x0B"), ' ') | |
| ->removeDuplicates(' ') | |
| ->trim() | |
| ; | |
| } | |
| /** | |
| * Checks if the string starts with a substring. | |
| * @param string $substr substring | |
| * @return bool true if the string starts with $substr. | |
| */ | |
| public function startsWith($substr) | |
| { | |
| return ($this->indexOf($substr) === 0); | |
| } | |
| /** | |
| * Returns part of the string. | |
| * @param int $start | |
| * @param int $length | |
| * @return String | |
| */ | |
| public function substring($start, $length = null) | |
| { | |
| if (function_exists('mb_substr')) { | |
| $string = mb_substr($this->_string, $start, $length, $this->getEncoding()); | |
| } else if ($this->getEncoding() === 'UTF-8' && function_exists('utf8_substr')) { | |
| $string = utf8_substr($this->_string, $start, $length); | |
| } else if (function_exists('iconv_substr')) { | |
| $string = iconv_substr($this->_string, $start, $length, $this->getEncoding()); | |
| } else { | |
| $string = substr($this->_string, $start, $length); | |
| } | |
| return new self($string); | |
| } | |
| /** | |
| * Gets the substring after the first occurrence of a separator. | |
| * If no match is found returns null. | |
| * @param string $separator | |
| * @param bool $inclusive whether to return the seperator (default false) | |
| * @return String | |
| */ | |
| public function substringAfterFirst($separator, $inclusive = false) | |
| { | |
| $incString = strstr($this->_string, $separator); | |
| if ($incString === false) { | |
| return null; | |
| } | |
| $string = new self($incString); | |
| if ($inclusive) { | |
| return $string; | |
| } | |
| return $string->substring(1); | |
| } | |
| /** | |
| * Gets the substring after the last occurrence of a separator. | |
| * If no match is found returns null. | |
| * @param String $separator | |
| * @param bool $inclusive whether to return the seperator (default false) | |
| * @return String | |
| */ | |
| public function substringAfterLast($separator, $inclusive = false) | |
| { | |
| $incString = strrchr($this->_string, $separator); | |
| if ($incString === false) { | |
| return null; | |
| } | |
| $string = new self($incString); | |
| if ($inclusive) { | |
| return $string; | |
| } | |
| return $string->substring(1); | |
| } | |
| /** | |
| * Gets the substring before the first occurrence of a separator. | |
| * If no match is found returns null. | |
| * @param String $separator | |
| * @param bool $inclusive whether to return the seperator (default false) | |
| * @return String | |
| */ | |
| public function substringBeforeFirst($separator, $inclusive = false) | |
| { | |
| if (version_compare(PHP_VERSION, '5.3.0') < 0) { | |
| $pos = $this->indexOf($separator); | |
| if ($pos === false) { | |
| return null; | |
| } | |
| if ($inclusive) { | |
| ++$pos; | |
| } | |
| return $this->substring(0, $pos); | |
| } | |
| $excString = strstr($this->_string, $separator, true); | |
| if ($excString === false) { | |
| return null; | |
| } | |
| $string = new self($excString); | |
| if ($inclusive) { | |
| return $string->concat($separator); | |
| } | |
| return $string; | |
| } | |
| /** | |
| * Gets the substring before the last occurrence of a separator. | |
| * If no match is found returns null. | |
| * @param String $separator | |
| * @param bool $inclusive whether to return the seperator (default false) | |
| * @return String | |
| */ | |
| public function substringBeforeLast($separator, $inclusive = false) | |
| { | |
| $pos = $this->lastIndexOf($separator); | |
| if ($pos === false) { | |
| return null; | |
| } | |
| if ($inclusive) { | |
| ++$pos; | |
| } | |
| return $this->substring(0, $pos); | |
| } | |
| /** | |
| * Gets the String that is nested in between two Strings. | |
| * If one of the delimiters is null, it will use the other one. | |
| * Only the first match will be returned. If no match is found returns null. | |
| * @param String $left left delimiter | |
| * @param String $right right delimiter | |
| * @return String | |
| */ | |
| public function substringBetween($left, $right = null) | |
| { | |
| if ($left === null && $right === null) { | |
| return null; | |
| } | |
| if ($left === null) { | |
| $left = $right; | |
| } else if ($right === null) { | |
| $right = $left; | |
| } | |
| if (!($left instanceof self)) { | |
| $left = new self($left); | |
| } | |
| if (!($right instanceof self)) { | |
| $right = new self($right); | |
| } | |
| $posLeft = $this->indexOf($left); | |
| if ($posLeft === false) { | |
| return null; | |
| } | |
| $posLeft += $left->length(); | |
| $posRight = $this->indexOf($right, $posLeft + 1); | |
| if ($posRight === false) { | |
| return null; | |
| } | |
| return $this->substring($posLeft, $posRight - $posLeft); | |
| } | |
| /** | |
| * Count the number of substring occurrences. | |
| * @param string $substr | |
| * @return int | |
| */ | |
| public function substringCount($substr) | |
| { | |
| return substr_count($this->_string, (string)$substr); | |
| } | |
| public function substringReplace($start, $length, $replacement = '') | |
| { | |
| } | |
| /** | |
| * Same as {@link substringBetween}, but returns array with all matches. | |
| * If no match is found, returns null. | |
| * @param String $substr1 | |
| * @param String $substr2 | |
| * @return array | |
| */ | |
| public function substringsBetween($substr1, $substr2 = null) | |
| { | |
| return null; | |
| } | |
| /** | |
| * Converts uppercase characters lowercase and vice versa. | |
| * @return String | |
| */ | |
| public function swapCase() | |
| { | |
| $string = ''; | |
| $length = $this->length(); | |
| for ($i = 0; $i < $length; $i++) { | |
| $char = $this->charAt($i); | |
| if ($char->isLowerCase()) { | |
| $string .= $char->toUpperCase(); | |
| } else { | |
| $string .= $char->toLowerCase(); | |
| } | |
| } | |
| return new self($string); | |
| } | |
| /** | |
| * Converts the string to array. | |
| * Each element in the array contains one character. | |
| * @return array | |
| */ | |
| public function toArray() | |
| { | |
| if ($this->getEncoding() === 'UTF-8' && function_exists('utf8_str_split')) { | |
| return utf8_str_split($this->_string, 1); | |
| } | |
| return str_split($this->_string, 1); | |
| } | |
| /** | |
| * Returns JSON representation of the string. | |
| * @return string | |
| */ | |
| public function toJson() | |
| { | |
| return json_encode($this->_string); | |
| } | |
| /** | |
| * Converts a string to lower case. | |
| * Example: | |
| * <code> | |
| * <?php | |
| * $string = new String('aBc'); | |
| * echo $string->toLowerCase(); // prints: abc | |
| * ?> | |
| * </code> | |
| * @return String | |
| */ | |
| public function toLowerCase() | |
| { | |
| if (function_exists('mb_strtolower')) { | |
| $string = mb_strtolower($this->_string, $this->getEncoding()); | |
| } else if ($this->getEncoding() === 'UTF-8' && function_exists('utf8_strtolower')) { | |
| $string = utf8_strtolower($this->_string); | |
| } else { | |
| $string = strtolower($this->_string); | |
| } | |
| return new self($string); | |
| } | |
| /** | |
| * Returns the literal value of the string. | |
| * @return string | |
| */ | |
| public function toString() | |
| { | |
| return $this->_string; | |
| } | |
| /** | |
| * Converts a string to upper case. | |
| * Example: | |
| * <code> | |
| * <?php | |
| * $string = new String('aBc'); | |
| * echo $string->toUpperCase(); // prints: ABC | |
| * ?> | |
| * </code> | |
| * @return String | |
| */ | |
| public function toUpperCase() | |
| { | |
| if (function_exists('mb_strtoupper')) { | |
| $string = mb_strtoupper($this->_string, $this->getEncoding()); | |
| } else if ($this->getEncoding() === 'UTF-8' && function_exists('utf8_strtoupper')) { | |
| $string = utf8_strtoupper($this->_string); | |
| } else { | |
| $string = strtoupper($this->_string); | |
| } | |
| return new self($string); | |
| } | |
| /** | |
| * Removes characters from both parts of the string. | |
| * If $charlist is not provided, the default is to remove spaces. | |
| * @param string $charlist characters to remove (default space characters) | |
| * @return String | |
| */ | |
| public function trim($charlist = null) | |
| { | |
| if ($charlist !== null && $this->getEncoding() === 'UTF-8' && function_exists('utf8_trim')) { | |
| $string = utf8_trim($this->_string, $charlist); | |
| } else { | |
| $string = trim($this->_string, $charlist); | |
| } | |
| return new self($string); | |
| } | |
| /** | |
| * Removes characters from the right part of the string. | |
| * If $charlist is not provided, the default is to remove spaces. | |
| * @param string $charlist characters to remove (default space characters) | |
| * @return String | |
| */ | |
| public function trimEnd($charlist = null) | |
| { | |
| if ($charlist !== null && $this->getEncoding() === 'UTF-8' && function_exists('utf8_rtrim')) { | |
| $string = utf8_rtrim($this->_string, $charlist); | |
| } else { | |
| $string = rtrim($this->_string, $charlist); | |
| } | |
| return new self($string); | |
| } | |
| /** | |
| * Removes characters from the left part of the string. | |
| * If $charlist is not provided, the default is to remove spaces. | |
| * @param string $charlist characters to remove (default space characters) | |
| * @return String | |
| */ | |
| public function trimStart($charlist = null) | |
| { | |
| if ($charlist !== null && $this->getEncoding() === 'UTF-8' && function_exists('utf8_ltrim')) { | |
| $string = utf8_ltrim($this->_string, $charlist); | |
| } else { | |
| $string = ltrim($this->_string, $charlist); | |
| } | |
| return new self($string); | |
| } | |
| /** | |
| * Uncapitalizes a string. | |
| * Changes the first letter to lowercase. | |
| * Example: | |
| * <code> | |
| * <?php | |
| * $string = new String('ABCdE'); | |
| * echo $string->uncapitalize(); // prints: aBCdE | |
| * ?> | |
| * </code> | |
| * @return String | |
| */ | |
| public function uncapitalize() | |
| { | |
| if (function_exists('mb_lcfirst')) { | |
| $string = mb_lcfirst($this->_string, $this->getEncoding()); | |
| } else if (function_exists('mb_substr')) { | |
| $encoding = $this->getEncoding(); | |
| $string = mb_strtolower(mb_substr($this->_string, 0, 1, $encoding), $encoding) . | |
| mb_substr($this->_string, 1, null, $encoding); | |
| } else if (function_exists('lcfirst')) { | |
| $string = lcfirst($this->_string); | |
| } else { | |
| $string = strtolower(substr($this->_string, 0, 1)) . | |
| substr($this->_string, 1); | |
| } | |
| return new self($string); | |
| } | |
| /** | |
| * Checks if current position is valid. | |
| * @return bool | |
| */ | |
| public function valid() | |
| { | |
| return ($this->_index >= 0 && $this->_index < $this->length()); | |
| } | |
| /** | |
| * Returns the literal value of the string. | |
| * @return string | |
| */ | |
| public function valueOf() | |
| { | |
| return $this->_string; | |
| } | |
| /** | |
| * Checks if the mbstring extension is installed and loaded. | |
| * @access private | |
| * @return bool true if mbstring is available | |
| */ | |
| private static function _mbstringLoaded() | |
| { | |
| if (self::$_extMbstring === null) { | |
| self::$_extMbstring = (bool)extension_loaded('mbstring'); | |
| } | |
| return self::$_extMbstring; | |
| } | |
| /** | |
| * Checks if the iconv extension is installed and loaded. | |
| * @access private | |
| * @return bool true if iconv is available | |
| */ | |
| private static function _iconvLoaded() | |
| { | |
| if (self::$_extIconv === null) { | |
| self::$_extIconv = (bool)extension_loaded('iconv'); | |
| } | |
| return self::$_extIconv; | |
| } | |
| /** | |
| * Checks if the utf8 package is installed and loaded. | |
| * @access private | |
| * @return bool true if utf8 package is available | |
| */ | |
| private static function _utf8Loaded() | |
| { | |
| if (self::$_extUtf8 === null) { | |
| self::$_extUtf8 = (bool)(defined('UTF8_CORE') && UTF8_CORE === true); | |
| } | |
| return self::$_extUtf8; | |
| } | |
| /** | |
| * Returns an array with the string extensions that the class uses. | |
| * Possible values: standard, mbstring, iconv, utf8. | |
| * @return array | |
| */ | |
| public static function getLoadedExtensions() | |
| { | |
| $ext = array('standard'); | |
| if (self::_mbstringLoaded()) { | |
| $ext[] = 'mbstring'; | |
| } | |
| if (self::_iconvLoaded()) { | |
| $ext[] = 'iconv'; | |
| } | |
| if (self::_utf8Loaded()) { | |
| $ext[] = 'utf8'; | |
| } | |
| return $ext; | |
| } | |
| /** | |
| * Sets default encoding. | |
| * Use null for auto-detection. | |
| * @param string $encoding encoding (default null) | |
| */ | |
| public static function setDefaultEncoding($encoding = null) | |
| { | |
| if ($encoding === null) { | |
| self::$_defaultEncoding = null; | |
| } else { | |
| self::$_defaultEncoding = strtoupper(str_replace(' ', '-', (string)$encoding)); | |
| } | |
| } | |
| /** | |
| * Returns default encoding. | |
| * @return string | |
| */ | |
| public static function getDefaultEncoding() | |
| { | |
| return self::$_defaultEncoding; | |
| } | |
| /** | |
| * Constructs a string object with the first argument as the string. | |
| * Returns the result of the instance method $name. | |
| * @param mixed $name callback function | |
| * @param array $args function arguments. the first argument is the string literal. | |
| * @return mixed | |
| * @throws BadFunctionCallException | |
| */ | |
| public static function callbackStatic($name, array $args) | |
| { | |
| if (empty($args)) { | |
| throw new BadFunctionCallException('Static callback requires at least one parameter.'); | |
| } | |
| $literal = array_shift($args); | |
| $string = new self($literal); | |
| return call_user_func_array(array($string, $name), $args); | |
| } | |
| /** | |
| * Overload method. Proxies to {@link callbackStatic()}. | |
| * Method name starts with an underscore to prevent name clashes. | |
| * Example: | |
| * <code> | |
| * <?php | |
| * echo String::_squeeze(' a b c ') // prints: a b c | |
| * ?> | |
| * </code> | |
| * @param mixed $name | |
| * @param array $args | |
| * @return mixed | |
| * @throws BadFunctionCallException | |
| */ | |
| public static function __callStatic($name, $args) | |
| { | |
| $name = substr($name, 1); | |
| return self::callbackStatic($name, $args); | |
| } | |
| /** | |
| * Returns String with the first string argument. | |
| * If no string is found, returns an empty String. | |
| * Example: | |
| * <code> | |
| * <?php | |
| * echo String::first(array(), 0, 'first', null, 'second'); // prints: first | |
| * ?> | |
| * </code> | |
| * @return String | |
| */ | |
| public static function first() | |
| { | |
| $args = func_get_args(); | |
| foreach ($args as $arg) { | |
| if (is_string($arg) || $arg instanceof self) { | |
| return new self($arg); | |
| } | |
| } | |
| return new self(); | |
| } | |
| /** | |
| * Formats and returns String. | |
| * @param string $string formatting string | |
| * @param array $args | |
| * @return String | |
| */ | |
| public static function format($string, array $args) | |
| { | |
| return new self(vsprintf((string)$string), $args); | |
| } | |
| /** | |
| * Returns random String in length of $length. | |
| * The String consists of characters in $charset. | |
| * @param int $length String's length | |
| * @param string $charset String's charset (default alpha-numeric characters) | |
| * @return String | |
| */ | |
| public static function random($length, $charset = self::ALNUM) | |
| { | |
| $length = (int)$length; | |
| $count = (int)self::getLength($charset); | |
| $str = ''; | |
| while ($length--) { | |
| $str .= $charset[mt_rand(0, $count - 1)]; | |
| } | |
| return new self($str); | |
| } | |
| } | |
| if (!class_exists('LogicException')) { | |
| class LogicException extends Exception{} | |
| } | |
| if (!class_exists('BadFunctionCallException')) { | |
| class BadFunctionCallException extends LogicException{} | |
| } | |
| if (!class_exists('BadMethodCallException')) { | |
| class BadMethodCallException extends BadFunctionCallException{} | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment