str.php 7.26 KB
Newer Older
Taylor Otwell committed
1
<?php namespace Laravel;
2 3 4 5

class Str {

	/**
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
	 * Get the default string encoding for the application.
	 *
	 * This method is simply a short-cut to Config::get('application.encoding').
	 *
	 * @return string
	 */
	public static function encoding()
	{
		return Config::get('application.encoding');
	}

	/**
	 * Get the length of a string.
	 *
	 * <code>
	 *		// Get the length of a string
	 *		$length = Str::length('Taylor Otwell');
	 *
	 *		// Get the length of a multi-byte string
	 *		$length = Str::length('Τάχιστη')
	 * </code>
	 *
	 * @param  string  $value
	 * @return int
	 */
	public static function length($value)
	{
		return (MB_STRING) ? mb_strlen($value, static::encoding()) : strlen($value);
	}

	/**
Taylor Otwell committed
37 38
	 * Convert a string to lowercase.
	 *
39 40
	 * <code>
	 *		// Convert a string to lowercase
41 42 43 44
	 *		$lower = Str::lower('Taylor Otwell');
	 *
	 *		// Convert a multi-byte string to lowercase
	 *		$lower = Str::lower('Τάχιστη');
45 46
	 * </code>
	 *
Taylor Otwell committed
47 48 49 50 51
	 * @param  string  $value
	 * @return string
	 */
	public static function lower($value)
	{
52
		return (MB_STRING) ? mb_strtolower($value, static::encoding()) : strtolower($value);
Taylor Otwell committed
53
	}
54

Taylor Otwell committed
55 56 57
	/**
	 * Convert a string to uppercase.
	 *
58 59
	 * <code>
	 *		// Convert a string to uppercase
60 61 62 63
	 *		$upper = Str::upper('Taylor Otwell');
	 *
	 *		// Convert a multi-byte string to uppercase
	 *		$upper = Str::upper('Τάχιστη');
64 65
	 * </code>
	 *
Taylor Otwell committed
66 67 68 69 70
	 * @param  string  $value
	 * @return string
	 */
	public static function upper($value)
	{
71
		return (MB_STRING) ? mb_strtoupper($value, static::encoding()) : strtoupper($value);
Taylor Otwell committed
72
	}
73

Taylor Otwell committed
74
	/**
75 76 77 78
	 * Convert a string to title case (ucwords equivalent).
	 *
	 * <code>
	 *		// Convert a string to title case
79 80 81 82
	 *		$title = Str::title('taylor otwell');
	 *
	 *		// Convert a multi-byte string to title case
	 *		$title = Str::title('νωθρού κυνός');
83
	 * </code>
Taylor Otwell committed
84 85 86 87 88 89
	 *
	 * @param  string  $value
	 * @return string
	 */
	public static function title($value)
	{
90
		if (MB_STRING)
91
		{
92
			return mb_convert_case($value, MB_CASE_TITLE, static::encoding());
93 94 95
		}

		return ucwords(strtolower($value));
Taylor Otwell committed
96
	}
97

Taylor Otwell committed
98
	/**
99 100
	 * Limit the number of characters in a string.
	 *
101
	 * <code>
102
	 *		// Returns "Tay..."
103 104 105 106
	 *		echo Str::limit('Taylor Otwell', 3);
	 *
	 *		// Limit the number of characters and append a custom ending
	 *		echo Str::limit('Taylor Otwell', 3, '---');
107 108 109
	 * </code>
	 *
	 * @param  string  $value
110
	 * @param  int     $limit
111 112 113
	 * @param  string  $end
	 * @return string
	 */
114
	public static function limit($value, $limit = 100, $end = '...')
115
	{
116
		if (static::length($value) <= $limit) return $value;
117

118
		if (MB_STRING)
119
		{
120
			return mb_substr($value, 0, $limit, static::encoding()).$end;
121
		}
122

123
		return substr($value, 0, $limit).$end;
124 125 126
	}

	/**
Taylor Otwell committed
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
	 * Limit the number of words in a string.
	 *
	 * <code>
	 *		// Returns "This is a..."
	 *		echo Str::words('This is a sentence.', 3);
	 *
	 *		// Limit the number of words and append a custom ending
	 *		echo Str::words('This is a sentence.', 3, '---');
	 * </code>
	 *
	 * @param  string  $value
	 * @param  int     $words
	 * @param  string  $end
	 * @return string
	 */
	public static function words($value, $words = 100, $end = '...')
	{
		preg_match('/^\s*+(?:\S++\s*+){1,'.$words.'}/', $value, $matches);

		if (static::length($value) == static::length($matches[0]))
		{
			$end = '';
		}

		return rtrim($matches[0]).$end;
	}

	/**
155 156 157 158 159 160 161 162 163
	 * Get the singular form of the given word.
	 *
	 * The word should be defined in the "strings" configuration file.
	 *
	 * @param  string  $value
	 * @return string
	 */
	public static function singular($value)
	{
164 165 166 167 168
		$inflection = Config::get('strings.inflection');

		$singular = array_get(array_flip($inflection), strtolower($value), $value);

		return (ctype_upper($value[0])) ? static::title($singular) : $singular;
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
	}

	/**
	 * Get the plural form of the given word.
	 *
	 * The word should be defined in the "strings" configuration file.
	 *
	 * <code>
	 *		// Returns the plural form of "child"
	 *		$plural = Str::plural('child', 10);
	 *
	 *		// Returns the singular form of "octocat" since count is one
	 *		$plural = Str::plural('octocat', 1);
	 * </code>
	 *
	 * @param  string  $value
Phill Sparks committed
185
	 * @param  int     $count
186 187 188 189 190 191
	 * @return string
	 */
	public static function plural($value, $count = 2)
	{
		if ((int) $count == 1) return $value;

192 193 194
		$plural = array_get(Config::get('strings.inflection'), strtolower($value), $value);

		return (ctype_upper($value[0])) ? static::title($plural) : $plural;
195 196 197 198
	}

	/**
	 * Generate a URL friendly "slug" from a given string.
Taylor Otwell committed
199
	 *
200
	 * <code>
201 202 203 204 205
	 *		// Returns "this-is-my-blog-post"
	 *		$slug = Str::slug('This is my blog post!');
	 *
	 *		// Returns "this_is_my_blog_post"
	 *		$slug = Str::slug('This is my blog post!', '_');
206 207
	 * </code>
	 *
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
	 * @param  string  $title
	 * @param  string  $separator
	 * @return string
	 */
	public static function slug($title, $separator = '-')
	{
		$title = static::ascii($title);

		// Remove all characters that are not the separator, letters, numbers, or whitespace.
		$title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', static::lower($title));

		// Replace all separator characters and whitespace by a single separator
		$title = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $title);

		return trim($title, $separator);
	}

	/**
	 * Convert a string to 7-bit ASCII.
	 *
	 * This is helpful for converting UTF-8 strings for usage in URLs, etc.
	 *
Taylor Otwell committed
230 231 232 233 234
	 * @param  string  $value
	 * @return string
	 */
	public static function ascii($value)
	{
235
		$foreign = Config::get('strings.ascii');
236 237

		$value = preg_replace(array_keys($foreign), array_values($foreign), $value);
238

Taylor Otwell committed
239 240
		return preg_replace('/[^\x09\x0A\x0D\x20-\x7E]/', '', $value);
	}
241

Taylor Otwell committed
242
	/**
243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
	 * Convert a string to an underscored, camel-cased class name.
	 *
	 * This method is primarily used to format task and controller names.
	 *
	 * <code>
	 *		// Returns "Task_Name"
	 *		$class = Str::classify('task_name');
	 *
	 *		// Returns "Taylor_Otwell"
	 *		$class = Str::classify('taylor otwell')
	 * </code>
	 *
	 * @param  string  $value
	 * @return string
	 */
	public static function classify($value)
	{
Taylor Otwell committed
260 261 262
		$search = array('_', '-', '.');

		return str_replace(' ', '_', static::title(str_replace($search, ' ', $value)));
263 264 265
	}

	/**
266 267 268 269 270 271 272 273 274 275 276
	 * Return the "URI" style segments in a given string.
	 *
	 * @param  string  $value
	 * @return array
	 */
	public static function segments($value)
	{
		return array_diff(explode('/', trim($value, '/')), array(''));
	}

	/**
Taylor Otwell committed
277 278
	 * Generate a random alpha or alpha-numeric string.
	 *
279
	 * <code>
280
	 *		// Generate a 40 character random alpha-numeric string
281 282
	 *		echo Str::random(40);
	 *
283
	 *		// Generate a 16 character random alphabetic string
284 285
	 *		echo Str::random(16, 'alpha');
	 * <code>
Taylor Otwell committed
286
	 *
Taylor Otwell committed
287
	 * @param  int	   $length
Taylor Otwell committed
288 289 290
	 * @param  string  $type
	 * @return string
	 */
Taylor Otwell committed
291
	public static function random($length, $type = 'alnum')
Taylor Otwell committed
292
	{
293 294
		return substr(str_shuffle(str_repeat(static::pool($type), 5)), 0, $length);
	}
295

296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
	/**
	 * Get the character pool for a given type of random string.
	 *
	 * @param  string  $type
	 * @return string
	 */
	protected static function pool($type)
	{
		switch ($type)
		{
			case 'alpha':
				return 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

			case 'alnum':
				return '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

			default:
313
				throw new \Exception("Invalid random string type [$type].");
314
		}
Taylor Otwell committed
315
	}
Taylor Otwell committed
316

317
}