Вот метод, который я использую для санации строк для URL SEF:
$slug = trim(strtolower($value));
$slug = preg_replace('/[^a-z0-9 _-]/', '', $slug);
return preg_replace('/\s+/', '-', $slug);
Не стесняйтесь добавлять дополнительные разрешенные символы к первому регулярному выражению.
Обратите внимание, что это НЕ Юникод или даже не полностью безопасный ISO-8891, ну, это так, но он пропустит все, что не a-z
. То есть вам может потребоваться предварительно нормализовать строку (т.е. заменить акцентированные символы их закрывающим эквивалентом ASCII.) Есть несколько вопросов и ответов по этому вопросу, которые я видел ранее, но я не могу найти их в момент Я отредактирую их здесь, если наткнусь на них.