str.php 6.8 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 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 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)
	{
		return array_get(array_flip(Config::get('strings.inflection')), strtolower($value), $value);
	}

	/**
	 * 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;

		return array_get(Config::get('strings.inflection'), strtolower($value), $value);
	}

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

182 183 184 185
		if (static::length($value) == static::length($matches[0]))
		{
			$end = '';
		}
186

187
		return rtrim($matches[0]).$end;
188 189 190
	}

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

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

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

Taylor Otwell committed
235
	/**
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
	 * 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)
	{
		return str_replace(' ', '_', static::title(str_replace(array('_', '.'), ' ', $value)));
	}

	/**
Taylor Otwell committed
257 258
	 * Generate a random alpha or alpha-numeric string.
	 *
259
	 * <code>
260
	 *		// Generate a 40 character random alpha-numeric string
261 262
	 *		echo Str::random(40);
	 *
263
	 *		// Generate a 16 character random alphabetic string
264 265
	 *		echo Str::random(16, 'alpha');
	 * <code>
Taylor Otwell committed
266
	 *
Taylor Otwell committed
267
	 * @param  int	   $length
Taylor Otwell committed
268 269 270
	 * @param  string  $type
	 * @return string
	 */
Taylor Otwell committed
271
	public static function random($length, $type = 'alnum')
Taylor Otwell committed
272
	{
273 274
		return substr(str_shuffle(str_repeat(static::pool($type), 5)), 0, $length);
	}
275

276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292
	/**
	 * 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:
293
				throw new \Exception("Invalid random string type [$type].");
294
		}
Taylor Otwell committed
295
	}
Taylor Otwell committed
296

297
}