str.php 7.23 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
	}

	/**
127 128 129 130 131 132 133 134 135
	 * 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)
	{
136 137 138 139 140
		$inflection = Config::get('strings.inflection');

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

		return (ctype_upper($value[0])) ? static::title($singular) : $singular;
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
	}

	/**
	 * 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
	 * @return string
	 */
	public static function plural($value, $count = 2)
	{
		if ((int) $count == 1) return $value;

163 164 165
		$plural = array_get(Config::get('strings.inflection'), strtolower($value), $value);

		return (ctype_upper($value[0])) ? static::title($plural) : $plural;
166 167 168 169
	}

	/**
	 * Limit the number of words in a string.
170 171
	 *
	 * <code>
172 173 174 175 176
	 *		// 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, '---');
177 178 179 180 181 182 183
	 * </code>
	 *
	 * @param  string  $value
	 * @param  int     $length
	 * @param  string  $end
	 * @return string
	 */
184
	public static function words($value, $words = 100, $end = '...')
185
	{
186
		preg_match('/^\s*+(?:\S++\s*+){1,'.$words.'}/', $value, $matches);
187

188 189 190 191
		if (static::length($value) == static::length($matches[0]))
		{
			$end = '';
		}
192

193
		return rtrim($matches[0]).$end;
194 195 196
	}

	/**
197
	 * Generate a URL friendly "slug" from a given string.
Taylor Otwell committed
198
	 *
199
	 * <code>
200 201 202 203 204
	 *		// 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!', '_');
205 206
	 * </code>
	 *
207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
	 * @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
229 230 231 232 233
	 * @param  string  $value
	 * @return string
	 */
	public static function ascii($value)
	{
234
		$foreign = Config::get('strings.ascii');
235 236

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

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

Taylor Otwell committed
241
	/**
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
	 * 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
259 260 261
		$search = array('_', '-', '.');

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

	/**
265 266 267 268 269 270 271 272 273 274 275
	 * 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
276 277
	 * Generate a random alpha or alpha-numeric string.
	 *
278
	 * <code>
279
	 *		// Generate a 40 character random alpha-numeric string
280 281
	 *		echo Str::random(40);
	 *
282
	 *		// Generate a 16 character random alphabetic string
283 284
	 *		echo Str::random(16, 'alpha');
	 * <code>
Taylor Otwell committed
285
	 *
Taylor Otwell committed
286
	 * @param  int	   $length
Taylor Otwell committed
287 288 289
	 * @param  string  $type
	 * @return string
	 */
Taylor Otwell committed
290
	public static function random($length, $type = 'alnum')
Taylor Otwell committed
291
	{
292 293
		return substr(str_shuffle(str_repeat(static::pool($type), 5)), 0, $length);
	}
294

295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
	/**
	 * 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:
312
				throw new \Exception("Invalid random string type [$type].");
313
		}
Taylor Otwell committed
314
	}
Taylor Otwell committed
315

316
}