Reputation: 360
Want to change text into slug using str_slug
. It works perfectly for different cases, but I want it to work without changing UpperCases, i.e.
ex: Hello --- World => Hello-World
Is there a way to get what I want?
Upvotes: 3
Views: 6345
Reputation:
Heres the implementation that str_slug
uses:
/**
* Generate a URL friendly "slug" from a given string.
*
* @param string $title
* @param string $separator
* @param string $language
* @return string
*/
public static function slug($title, $separator = '-', $language = 'en')
{
$title = static::ascii($title, $language);
// Convert all dashes/underscores into separator
$flip = $separator == '-' ? '_' : '-';
$title = preg_replace('!['.preg_quote($flip).']+!u', $separator, $title);
// Replace @ with the word 'at'
$title = str_replace('@', $separator.'at'.$separator, $title);
// Remove all characters that are not the separator, letters, numbers, or whitespace.
$title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', mb_strtolower($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);
}
Simply extend from this methods class or copy it to a new class of your own and then remove any code that converts case.
Upvotes: 2
Reputation: 2505
As stated on a question on laracasts.com you can create your own version of the helper function, that leaves out mb_strtolower()
:
public static function slug($title, $separator = '-', $language = 'en')
{
$title = static::ascii($title, $language);
// Convert all dashes/underscores into separator
$flip = $separator == '-' ? '_' : '-';
$title = preg_replace('!['.preg_quote($flip).']+!u', $separator, $title);
// Replace @ with the word 'at'
$title = str_replace('@', $separator.'at'.$separator, $title);
// Remove all characters that are not the separator, letters, numbers, or whitespace.
// With lower case: $title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', mb_strtolower($title));
$title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', $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);
}
Upvotes: 3