Как удалить все небуквенно-цифровые символы из строки в PHP?
Использование регулярного выражения с preg_replace
Лучший способ удалить все небуквенно-цифровые символы в PHP — использовать функцию preg_replace() с правильно составленным регулярным выражением. Она заменяет все совпадения с шаблоном на пустую строку, оставляя только то, что вам нужно.
Простое решение для латиницы и цифр
<?php
$text = "Hello, World! 123 @#$%";
$clean = preg_replace('/[^a-zA-Z0-9]/', '', $text);
echo $clean; // HelloWorld123
?>
Разберём регулярное выражение /[^a-zA-Z0-9]/:
- [ ] — символьный класс: обозначает набор символов
- ^ внутри скобок — отрицание: "все символы, КРОМЕ указанных"
- a-z — все строчные латинские буквы
- A-Z — все заглавные латинские буквы
- 0-9 — все цифры
Таким образом, [^a-zA-Z0-9] означает "любой символ, который не является латинской буквой или цифрой". Этот символ заменяется на пустую строку.
Решение с поддержкой кириллицы (и других UTF-8 символов)
Если вам нужно сохранить кириллицу, простое указание а-я не сработает из-за особенностей кодировки. Используйте модификатор u (UTF-8) и свойства Unicode:
<?php
$text = "Привет, мир! 123 @#$%";
$clean = preg_replace('/[^\p{L}\p{N}]/u', '', $text);
echo $clean; // Приветмир123
?>
Разберём это выражение:
- \p{L} — любая буква любого алфавита (латиница, кириллица, арабский, иероглифы и т.д.)
- \p{N} — любая цифра любого языка
- [^\p{L}\p{N}] — всё, что НЕ является буквой или цифрой
- u — модификатор, включающий режим UTF-8 (обязателен для работы с кириллицей)
Если нужно только латиницу + кириллицу + цифры (без других алфавитов)
Можно явно указать диапазоны в UTF-8:
<?php
$text = "Привет, мир! 123 @#$%";
$clean = preg_replace('/[^a-zA-Zа-яёА-ЯЁ0-9]/u', '', $text);
echo $clean; // Приветмир123
?>
Здесь а-яё и А-ЯЁ — это кириллические буквы в кодировке UTF-8. Модификатор u обязателен, иначе регулярка не поймёт многобайтовые символы.
Практический пример: очистка пользовательского ввода для логина
<?php
function sanitizeUsername($input) {
// Оставляем только буквы (латиница + кириллица) и цифры
return preg_replace('/[^a-zA-Zа-яёА-ЯЁ0-9]/u', '', $input);
}
$username = "Пользователь_123!@#";
echo sanitizeUsername($username); // Пользователь123
?>
Важные замечания
- Всегда проверяйте входящие данные — регулярки не гарантируют безопасность на 100%
- Для работы с кириллицей файл должен быть сохранён в кодировке UTF-8 без BOM
- Если нужно сохранить пробелы — добавьте
\sв отрицаемый класс:/[^\p{L}\p{N}\s]/u - Для производительности на больших строках можно использовать
str_replace()с массивами, но для универсальности лучшеpreg_replace()
Этот подход покрывает 99% случаев очистки строк от небуквенно-цифровых символов. Выбирайте вариант под свою задачу: универсальный \p{L}\p{N} или явные диапазоны для строгого контроля.
Альтернативный подход: фильтрация через ctype_alnum и str_split
Если вам не нравятся регулярные выражения или нужно обработать строку без них, можно использовать посимвольный перебор с функцией ctype_alnum(), которая проверяет, является ли символ буквенно-цифровым. Однако учтите: ctype_alnum() работает только с латиницей и цифрами, кириллицу она не пропустит.
<?php
function removeNonAlphanumeric($string) {
$result = '';
for ($i = 0; $i < strlen($string); $i++) {
$char = $string[$i];
if (ctype_alnum($char)) {
$result .= $char;
}
}
return $result;
}
$text = "Hello, World! 123 @#$%";
echo removeNonAlphanumeric($text); // HelloWorld123
?>
Для кириллицы — через mb_ereg_replace
Если регулярные выражения с модификатором u не работают (например, на старом PHP), можно использовать mb_ereg_replace() из расширения mbstring:
<?php
$text = "Привет, мир! 123 @#$%";
$clean = mb_ereg_replace('[^a-zA-Zа-яёА-ЯЁ0-9]', '', $text);
echo $clean; // Приветмир123
?>
Недостатки этих методов: посимвольный перебор медленнее на длинных строках, а ctype_alnum() не поддерживает многобайтовые кодировки. Для большинства задач лучше использовать preg_replace с Unicode-свойствами — это и быстрее, и надёжнее.
Ответов пока нет.
Войдите чтобы оставить ответ