preg_replace('/[^a-zA-Z0-9]+/', '_', $sentence)
По сути, он ищет любую последовательность не буквенно-цифровых символов и заменяет ее одним символом '_'. Таким образом, вы также избегаете двух последовательных _ в выходных данных.
Если это для URL, вы, вероятно, также хотите, чтобы они были только в нижнем регистре:
preg_replace('/[^a-z0-9]+/', '_', strtolower($sentence))