* $string = 'lannisters_always_pay_their_debts';
* $camelcase = Strings::underscoreToCamelCase($string);
*
* Result:
*
* LannistersAlwaysPayTheirDebts
*
*
* @param string $string
* @return string
*/
public static function underscoreToCamelCase($string)
{
return str_replace('_', '', ucwords($string, '_'));
}
/**
* Changes camel case string to underscored.
*
* Example:
*
* $string = 'LannistersAlwaysPayTheirDebts';
* $underscored = Strings::camelCaseToUnderscore($string);
*
* Result:
*
* lannisters_always_pay_their_debts
*
*
* @param string $string
* @return string
*/
public static function camelCaseToUnderscore($string)
{
return mb_strtolower(preg_replace('/(?
* $string = 'prefixRest';
* $withoutPrefix = Strings::removePrefix($string, 'prefix');
*
* Result:
*
* Rest
*
*
* @param string $string
* @param string $prefix
* @return string
*/
public static function removePrefix($string, $prefix)
{
if (self::startsWith($string, $prefix)) {
return substr($string, mb_strlen($prefix));
}
return $string;
}
/**
* Removes prefixes defined in array from string.
*
* Example:
*
* $string = 'prefixRest';
* $withoutPrefix = Strings::removePrefixes($string, array('pre', 'fix'));
*
* Result:
*
* Rest
*
*
* @param string $string
* @param array $prefixes
* @return mixed
*/
public static function removePrefixes($string, array $prefixes)
{
return array_reduce($prefixes, function ($string, $prefix) {
return Strings::removePrefix($string, $prefix);
}, $string);
}
/**
* Returns a new string without the given suffix.
*
* Example:
*
* $string = 'JohnSnow';
* $withoutSuffix = Strings::removeSuffix($string, 'Snow');
*
* Result:
*
* John
*
*
* @param string $string
* @param string $suffix
* @return string
*/
public static function removeSuffix($string, $suffix)
{
if (self::endsWith($string, $suffix)) {
return mb_substr($string, 0, -mb_strlen($suffix));
}
return $string;
}
/**
* Method checks if string starts with $prefix.
*
* Example:
*
* $string = 'prefixRest';
* $result = Strings::startsWith($string, 'prefix');
*
* Result:
*
* true
*
*
* @param string $string
* @param string $prefix
* @return bool
*/
public static function startsWith($string, $prefix)
{
$string = is_int($string) ? "$string" : $string;
$prefix = is_int($prefix) ? "$prefix" : $prefix;
return is_string($string) && is_string($prefix) && mb_substr($string, 0, mb_strlen($prefix)) === $prefix;
}
/**
* Method checks if string ends with $suffix.
*
* Example:
*
* $string = 'StringSuffix';
* $result = Strings::endsWith($string, 'Suffix');
*
* Result:
*
* true
*
*
* @param string $string
* @param string $suffix
* @return bool
*/
public static function endsWith($string, $suffix)
{
$string = is_int($string) ? "$string" : $string;
$suffix = is_int($suffix) ? "$suffix" : $suffix;
$suffixLength = mb_strlen($suffix);
return is_string($string) && is_string($suffix) && mb_substr($string, -$suffixLength, $suffixLength) === $suffix;
}
/**
* Determines whether two strings contain the same data, ignoring the case of the letters in the strings.
*
* Example:
*
* $equal = Strings::equalsIgnoreCase('ABC123', 'abc123');
*
* Result:
*
* true
*
*
* @param string $string1
* @param string $string2
* @return bool
*/
public static function equalsIgnoreCase($string1, $string2)
{
return mb_strtolower($string1) == mb_strtolower($string2);
}
/**
* Removes all occurrences of a substring from string.
*
* Example:
*
* $string = 'winter is coming???!!!';
* $result = Strings::remove($string, '???');
*
* Result:
*
* winter is coming!!!
*
*
* @param string $string
* @param string $toRemove
* @return mixed
*/
public static function remove($string, $toRemove)
{
$string = is_int($string) ? "$string" : $string;
$toRemove = is_int($toRemove) ? "$toRemove" : $toRemove;
if (is_null($string) || is_null($toRemove)) {
return $string;
}
return str_replace($toRemove, '', $string);
}
/**
* Adds suffix to the string.
*
* Example:
*
* $string = 'Daenerys';
* $stringWithSuffix = Strings::appendSuffix($string, ' Targaryen');
*
* Result:
*
* Daenerys Targaryen
*
*
* @param string $string
* @param string $suffix
* @return string
*/
public static function appendSuffix($string, $suffix = '')
{
if (is_null($string)) {
return null;
}
return $string . $suffix;
}
/**
* Adds prefix to the string.
*
* Example:
*
* $string = 'Targaryen';
* $stringWithPrefix = Strings::appendPrefix($string, 'Daenerys ');
*
* Result:
*
* Daenerys Targaryen
*
*
* @param string $string
* @param string $prefix
* @return string
*/
public static function appendPrefix($string, $prefix = '')
{
if (is_null($string)) {
return null;
}
return $prefix . $string;
}
/**
* Adds suffix to the string, if string does not end with the suffix already.
*
* Example:
*
* $string = 'Daenerys Targaryen';
* $stringWithPrefix = Strings::appendMissingSuffix($string, ' Targaryen');
*
* Result:
*
* Daenerys Targaryen
*
*
* @param string $string
* @param string $suffix
* @return string
*/
public static function appendIfMissing($string, $suffix)
{
if (Strings::endsWith($string, $suffix)) {
return $string;
}
return Strings::appendSuffix($string, $suffix);
}
/**
* Adds prefix to the string, if string does not start with the prefix already.
*
* Example:
*
* $string = 'Daenerys Targaryen';
* $stringWithPrefix = Strings::appendMissingPrefix($string, 'Daenerys ');
*
* Result:
*
* Daenerys Targaryen
*
*
* @param string $string
* @param string $prefix
* @return string
*/
public static function prependIfMissing($string, $prefix)
{
if (Strings::startsWith($string, $prefix)) {
return $string;
}
return Strings::appendPrefix($string, $prefix);
}
/**
* Converts a word into the format for an Ouzo table name. Converts 'ModelName' to 'model_names'.
*
* Example:
*
* $class = "BigFoot";
* $table = Strings::tableize($class);
*
* Result:
*
* BigFeet
*
*
* @param string $class
* @return string
*/
public static function tableize($class)
{
$underscored = Strings::camelCaseToUnderscore($class);
$parts = explode('_', $underscored);
$suffix = Inflector::pluralize(array_pop($parts));
$parts[] = $suffix;
return implode('_', $parts);
}
/**
* Changes new lines to <br> and converts special characters to HTML entities.
*
* Example:
*
* $string = "My name is Reek \nit rhymes with leek";
* $escaped = Strings::escapeNewLines($string);
*
* Result:
*
* My name is <strong>Reek</strong>
it rhymes with leek
*
*
* @param string $string
* @return string
*/
public static function escapeNewLines($string)
{
$string = htmlspecialchars($string);
return nl2br($string);
}
/**
* Alias for html_entity_decode() with UTF-8 and defined flag ENT_COMPAT.
*
* @param string $text
* @return string
*/
public static function htmlEntityDecode($text)
{
return html_entity_decode($text, ENT_COMPAT, 'UTF-8');
}
/**
* Alias for htmlspecialchars() with UTF-8 and flags ENT_COMPAT and ENT_SUBSTITUTE (ENT_IGNORE for php <= 5.3).
*
* @param string $text
* @return string
*/
public static function htmlEntities($text)
{
$flag = defined('ENT_SUBSTITUTE') ? ENT_SUBSTITUTE : ENT_IGNORE;
return htmlspecialchars($text, ENT_COMPAT | $flag, 'UTF-8');
}
/**
* Method checks if string representations of two objects are equal.
*
* Example:
*
* $result = Strings::equal('0123', 123);
*
* Result:
*
* false
*
*
* @param mixed $object1
* @param mixed $object2
* @return bool
*/
public static function equal($object1, $object2)
{
return (string)$object1 === (string)$object2;
}
/**
* Method checks if string is blank.
*
* Example:
*
* $result = Strings::isBlank('0');
*
* Result:
*
* false
*
*
* @param string $string
* @return bool
*/
public static function isBlank($string)
{
return mb_strlen(trim($string)) == 0;
}
/**
* Method checks if string is not blank.
*
* Example:
*
* $result = Strings::isNotBlank('0');
*
* Result:
*
* true
*
*
* @param string $string
* @return bool
*/
public static function isNotBlank($string)
{
return !Strings::isBlank($string);
}
/**
* Abbreviate - abbreviates a string using ellipsis.
*
* Example:
*
* $result = Strings::abbreviate('ouzo is great', 5);
*
* Result:
*
* ouzo ...
*
*
* To whole word:
*
* $result = Strings::abbreviate('ouzo is great', 6, true);
*
* Result:
*
* ouzo ...
*
*
* @param string $string
* @param string $maxWidth
* @param bool $toWholeWord
* @return string
*/
public static function abbreviate($string, $maxWidth, $toWholeWord = false)
{
$fullLength = mb_strlen($string);
if ($fullLength <= $maxWidth) {
return $string;
}
if ($toWholeWord) {
$lastSpace = mb_strrpos($string, ' ', -($fullLength - $maxWidth) + 1);
$maxWidth = $lastSpace ? $lastSpace+1 : $maxWidth;
}
return mb_substr($string, 0, $maxWidth) . '...';
}
/**
* Removes control characters from both ends of this string returning null if the string is empty ("") after the trim or if it is null.
*
* Example:
*
* $result = Strings::trimToNull(' ');
*
* Result:
*
* null
*
*
* @param string $string
* @return string
*/
public static function trimToNull($string)
{
$string = trim($string);
if (mb_strlen($string) == 0) {
return null;
}
return $string;
}
/**
* Replace all occurrences of placeholder in string with values from associative array.
*
* Example:
*
* $sprintfString = "This is %{what}! %{what}? This is %{place}!";
* $assocArray = array(
* 'what' => 'madness',
* 'place' => 'Sparta'
* );
*
* Result:
*
* 'This is madness! madness? This is Sparta!'
*
*
* @param string $string
* @param array $params
* @return string
*/
public static function sprintAssoc($string, $params)
{
foreach ($params as $key => $value) {
$string = preg_replace("/%{($key)}/", $value, $string);
}
return $string;
}
/**
* Replace all occurrences of placeholder in string with values from associative array.
* When no value for placeholder is found in array, a default empty value is used if not otherwise specified.
*
* Example:
*
* $sprintfString = "This is %{what}! %{what}? This is %{place}!";
* $assocArray = array(
* 'what' => 'madness',
* 'place' => 'Sparta'
* );
*
* Result:
*
* 'This is madness! madness? This is Sparta!'
*
*
* @param string $string
* @param array $params
* @param string $default
* @return string
*/
public static function sprintAssocDefault($string, $params, $default = '')
{
foreach ($params as $key => $value) {
$string = preg_replace("/%{($key)}/", $value, $string);
}
$string = preg_replace("/%{\w*}/", $default, $string);
return $string;
}
/**
* Checks if string contains the substring.
*
* @param string $string
* @param string $substring
* @return bool
*/
public static function contains($string, $substring)
{
return mb_strpos($string, $substring) !== false;
}
/**
* Checks if string contains the substring, ignoring the case of the letters in the strings.
*
* @param string $string
* @param string $substring
* @return bool
*/
public static function containsIgnoreCase($string, $substring)
{
return self::contains(mb_strtolower($string), mb_strtolower($substring));
}
/**
* Gets the substring before the first occurrence of a separator. The separator is not returned.
*
* @param string $string
* @param string $separator
* @return string
*/
public static function substringBefore($string, $separator)
{
$pos = mb_strpos($string, $separator);
return $pos !== false ? mb_substr($string, 0, $pos) : $string;
}
/**
* Gets the substring after the first occurrence of a separator. The separator is not returned.
*
* @param string $string
* @param string $separator
* @return string
*/
public static function substringAfter($string, $separator)
{
$pos = mb_strpos($string, $separator);
if ($pos === false) {
return $string;
}
return mb_substr($string, $pos + 1, mb_strlen($string));
}
/**
* @param string $subject
* @param string $search
* @param string $replace
* @param int $nth
* @return string
*/
public static function replaceNth($subject, $search, $replace, $nth)
{
$found = preg_match_all('/' . $search . '/', $subject, $matches, PREG_OFFSET_CAPTURE);
if (false !== $found && $found > $nth) {
return substr_replace($subject, $replace, $matches[0][$nth][1], mb_strlen($search));
}
return $subject;
}
/**
* Removes accent from letters in string.
*
* Example:
*
* $string = "śżźćółŹĘÀÁÂ";
*
* Result:
*
* 'szzcolZEAAA'
*
*
* @param string $string
* @return string
*/
public static function removeAccent($string)
{
if (false === preg_match('/[\x80-\xff]/', $string)) {
return $string;
}
$chars = [
// Decompositions for Latin-1 Supplement
chr(195) . chr(128) => 'A', chr(195) . chr(129) => 'A',
chr(195) . chr(130) => 'A', chr(195) . chr(131) => 'A',
chr(195) . chr(132) => 'A', chr(195) . chr(133) => 'A',
chr(195) . chr(135) => 'C', chr(195) . chr(136) => 'E',
chr(195) . chr(137) => 'E', chr(195) . chr(138) => 'E',
chr(195) . chr(139) => 'E', chr(195) . chr(140) => 'I',
chr(195) . chr(141) => 'I', chr(195) . chr(142) => 'I',
chr(195) . chr(143) => 'I', chr(195) . chr(145) => 'N',
chr(195) . chr(146) => 'O', chr(195) . chr(147) => 'O',
chr(195) . chr(148) => 'O', chr(195) . chr(149) => 'O',
chr(195) . chr(150) => 'O', chr(195) . chr(153) => 'U',
chr(195) . chr(154) => 'U', chr(195) . chr(155) => 'U',
chr(195) . chr(156) => 'U', chr(195) . chr(157) => 'Y',
chr(195) . chr(159) => 's', chr(195) . chr(160) => 'a',
chr(195) . chr(161) => 'a', chr(195) . chr(162) => 'a',
chr(195) . chr(163) => 'a', chr(195) . chr(164) => 'a',
chr(195) . chr(165) => 'a', chr(195) . chr(167) => 'c',
chr(195) . chr(168) => 'e', chr(195) . chr(169) => 'e',
chr(195) . chr(170) => 'e', chr(195) . chr(171) => 'e',
chr(195) . chr(172) => 'i', chr(195) . chr(173) => 'i',
chr(195) . chr(174) => 'i', chr(195) . chr(175) => 'i',
chr(195) . chr(177) => 'n', chr(195) . chr(178) => 'o',
chr(195) . chr(179) => 'o', chr(195) . chr(180) => 'o',
chr(195) . chr(181) => 'o', chr(195) . chr(182) => 'o',
chr(195) . chr(182) => 'o', chr(195) . chr(185) => 'u',
chr(195) . chr(186) => 'u', chr(195) . chr(187) => 'u',
chr(195) . chr(188) => 'u', chr(195) . chr(189) => 'y',
chr(195) . chr(191) => 'y',
// Decompositions for Latin Extended-A
chr(196) . chr(128) => 'A', chr(196) . chr(129) => 'a',
chr(196) . chr(130) => 'A', chr(196) . chr(131) => 'a',
chr(196) . chr(132) => 'A', chr(196) . chr(133) => 'a',
chr(196) . chr(134) => 'C', chr(196) . chr(135) => 'c',
chr(196) . chr(136) => 'C', chr(196) . chr(137) => 'c',
chr(196) . chr(138) => 'C', chr(196) . chr(139) => 'c',
chr(196) . chr(140) => 'C', chr(196) . chr(141) => 'c',
chr(196) . chr(142) => 'D', chr(196) . chr(143) => 'd',
chr(196) . chr(144) => 'D', chr(196) . chr(145) => 'd',
chr(196) . chr(146) => 'E', chr(196) . chr(147) => 'e',
chr(196) . chr(148) => 'E', chr(196) . chr(149) => 'e',
chr(196) . chr(150) => 'E', chr(196) . chr(151) => 'e',
chr(196) . chr(152) => 'E', chr(196) . chr(153) => 'e',
chr(196) . chr(154) => 'E', chr(196) . chr(155) => 'e',
chr(196) . chr(156) => 'G', chr(196) . chr(157) => 'g',
chr(196) . chr(158) => 'G', chr(196) . chr(159) => 'g',
chr(196) . chr(160) => 'G', chr(196) . chr(161) => 'g',
chr(196) . chr(162) => 'G', chr(196) . chr(163) => 'g',
chr(196) . chr(164) => 'H', chr(196) . chr(165) => 'h',
chr(196) . chr(166) => 'H', chr(196) . chr(167) => 'h',
chr(196) . chr(168) => 'I', chr(196) . chr(169) => 'i',
chr(196) . chr(170) => 'I', chr(196) . chr(171) => 'i',
chr(196) . chr(172) => 'I', chr(196) . chr(173) => 'i',
chr(196) . chr(174) => 'I', chr(196) . chr(175) => 'i',
chr(196) . chr(176) => 'I', chr(196) . chr(177) => 'i',
chr(196) . chr(178) => 'IJ', chr(196) . chr(179) => 'ij',
chr(196) . chr(180) => 'J', chr(196) . chr(181) => 'j',
chr(196) . chr(182) => 'K', chr(196) . chr(183) => 'k',
chr(196) . chr(184) => 'k', chr(196) . chr(185) => 'L',
chr(196) . chr(186) => 'l', chr(196) . chr(187) => 'L',
chr(196) . chr(188) => 'l', chr(196) . chr(189) => 'L',
chr(196) . chr(190) => 'l', chr(196) . chr(191) => 'L',
chr(197) . chr(128) => 'l', chr(197) . chr(129) => 'L',
chr(197) . chr(130) => 'l', chr(197) . chr(131) => 'N',
chr(197) . chr(132) => 'n', chr(197) . chr(133) => 'N',
chr(197) . chr(134) => 'n', chr(197) . chr(135) => 'N',
chr(197) . chr(136) => 'n', chr(197) . chr(137) => 'N',
chr(197) . chr(138) => 'n', chr(197) . chr(139) => 'N',
chr(197) . chr(140) => 'O', chr(197) . chr(141) => 'o',
chr(197) . chr(142) => 'O', chr(197) . chr(143) => 'o',
chr(197) . chr(144) => 'O', chr(197) . chr(145) => 'o',
chr(197) . chr(146) => 'OE', chr(197) . chr(147) => 'oe',
chr(197) . chr(148) => 'R', chr(197) . chr(149) => 'r',
chr(197) . chr(150) => 'R', chr(197) . chr(151) => 'r',
chr(197) . chr(152) => 'R', chr(197) . chr(153) => 'r',
chr(197) . chr(154) => 'S', chr(197) . chr(155) => 's',
chr(197) . chr(156) => 'S', chr(197) . chr(157) => 's',
chr(197) . chr(158) => 'S', chr(197) . chr(159) => 's',
chr(197) . chr(160) => 'S', chr(197) . chr(161) => 's',
chr(197) . chr(162) => 'T', chr(197) . chr(163) => 't',
chr(197) . chr(164) => 'T', chr(197) . chr(165) => 't',
chr(197) . chr(166) => 'T', chr(197) . chr(167) => 't',
chr(197) . chr(168) => 'U', chr(197) . chr(169) => 'u',
chr(197) . chr(170) => 'U', chr(197) . chr(171) => 'u',
chr(197) . chr(172) => 'U', chr(197) . chr(173) => 'u',
chr(197) . chr(174) => 'U', chr(197) . chr(175) => 'u',
chr(197) . chr(176) => 'U', chr(197) . chr(177) => 'u',
chr(197) . chr(178) => 'U', chr(197) . chr(179) => 'u',
chr(197) . chr(180) => 'W', chr(197) . chr(181) => 'w',
chr(197) . chr(182) => 'Y', chr(197) . chr(183) => 'y',
chr(197) . chr(184) => 'Y', chr(197) . chr(185) => 'Z',
chr(197) . chr(186) => 'z', chr(197) . chr(187) => 'Z',
chr(197) . chr(188) => 'z', chr(197) . chr(189) => 'Z',
chr(197) . chr(190) => 'z', chr(197) . chr(191) => 's'
];
return strtr($string, $chars);
}
/**
* Uppercase first letter (multi-byte safe).
*
* Example:
*
* $string = "łukasz";
*
* Result:
*
* 'Łukasz'
*
*
* @param string $string
* @return string
*/
public static function uppercaseFirst($string)
{
$first = mb_substr($string, 0, 1);
return mb_strtoupper($first) . mb_substr($string, 1);
}
}