Нет необходимости в начальном матче.Вы можете сделать безусловный поиск и замену.Если заменить нечего, ничего страшного.Здесь это как одна большая цепочка вызовов функций:
$slug = trim(preg_replace('/[\W_]+/', '_', strtolower($slug)), '_');
Или разделены на отдельные строки:
$slug = strlower($slug);
$slug = preg_replace('/[\W_]+/', '_', $slug);
$slug = trim($slug, '_');
Объяснение:
- Преобразовать верхний регистр встрочные буквы
strtolower
. - Поиск
\W
и _
.Символ «слово» - это буква, цифра или знак подчеркивания.Символ «не-слово» противоположен этому, то есть пробел, пунктуация и управляющие символы.\W
соответствует "несловесным" символам. - Замените эти плохие символы подчеркиванием.Если в строке более одного, все они будут заменены одним подчеркиванием.
- Подчеркивание подчеркивания в начале и конце строки.
Код на сложномсторона, потому что есть несколько сложных случаев, которые нужно обработать:
- Плохие символы на концах должны быть удалены, а не преобразованы в подчеркивание.Например,
!)
в вашем примере. - Мы хотим, чтобы
foo_-_bar
превратился в foo_bar
, а не foo___bar
.Подчеркивание должно быть свернуто, в основном.