charsetConverter->utf8_char_mapping($value); // Get rid of all invalid characters, but allow slashes $value = (string)preg_replace('/[^\p{L}\p{M}0-9\/' . preg_quote($fallbackCharacter, '/') . ']/u', '', $value); // Convert multiple fallback characters to a single one if ($fallbackCharacter !== '') { $value = (string)preg_replace('/' . preg_quote($fallbackCharacter, '/') . '{2,}/', $fallbackCharacter, $value); } // Ensure slug is lower cased after all replacement was done $value = mb_strtolower($value, 'utf-8'); // Extract slug, thus it does not have wrapping fallback and slash characters $extractedSlug = trim($value, $fallbackCharacter . '/'); // Remove trailing and beginning slashes, except if the trailing slash was added, then we'll re-add it $appendTrailingSlash = $extractedSlug !== '' && substr($value, -1) === '/'; $value = $extractedSlug . ($appendTrailingSlash ? '/' : ''); return $value; } }