Avatar ·

Как удалить все небуквенно-цифровые символы из строки в PHP?

Всем привет! Я новичок в PHP и столкнулся с такой проблемой: нужно очистить строку от всего, кроме букв (латиница и кириллица) и цифр. Пробовал через str_replace — получилось ужасно громоздко, пришлось перечислять каждый символ. Вот что я пытался сделать: ```php $text = "Привет, мир! Как дела? 123."; $clean = str_replace(array(',', '!', '?', '.', ' '), '', $text); echo $clean; // ПриветмирКакдела123 ``` Но это же несерьёзно — перечислять все возможные знаки препинания, пробелы и прочий мусор вручную. А если там будут скобки, слэши или спецсимволы вроде @#$%? К тому же, пользователь может ввести что угодно. Я слышал, что можно использовать регулярные выражения с preg_replace, но не понимаю, какой шаблон задать. Нужно, чтобы остались только: - Буквы латинского алфавита (a-z, A-Z) - Буквы кириллицы (а-я, А-Я) - Цифры (0-9) Всё остальное (пробелы, знаки препинания, спецсимволы, эмодзи) должно быть удалено. Подскажите, как правильно это сделать? Желательно с объяснением, чтобы я понимал, как работает регулярка. Заранее спасибо! <<>>

Использование регулярного выражения с 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-свойствами — это и быстрее, и надёжнее.