Если вам требуется поддержка других языков, вместо обычного A-Z, вы можете использовать следующее:
preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
[^\p{L}\p{N} ]
определяет отрицательный (он будет соответствовать символу, который не определен) класс символов:
\p{L}
: письмо от любого языка.
\p{N}
: числовой символ в любом скрипте.
: пробел.
+
жадно соответствует классу символов от 1 до неограниченно раз.
Это сохранит буквы и цифры из других языков и сценариев, а также A-Z:
preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界
Примечание: Это очень старый, но все еще актуальный вопрос. Я отвечаю исключительно, чтобы предоставить дополнительную информацию, которая может быть полезна для будущих посетителей.