Як видалити буквено-цифрові символи?


350

Мені потрібно видалити всі символи з рядка, які не a-z A-Z 0-9встановлені або не є пробілами.

Хтось має функцію для цього?

Відповіді:


697

Схоже, ви майже знали, що вже хочете зробити, ви в основному визначили це як регулярний вираз.

preg_replace("/[^A-Za-z0-9 ]/", '', $string);

8
zuk1: regexbuddy - це чудова допомога в цьому
перейдіть

2
Ось приклад, якщо ви хочете включити дефіс як дозволений символ. Мені це було потрібно, тому що мені потрібно було викреслити заборонені символи з імені користувача Moodle на основі адрес електронної пошти: preg_replace ("/ [^ a-z0-9 _. @ \ -] /", '', $ string);
Еван Донован

2
Чи буде це точно так само з апострофами (одноцитати) навколо регулярного виразу замість лапок (подвійних лапок)? Напр .:preg_replace('/[^A-Za-z0-9 ]/', '', $string);
2540625

3
Ми хочемо пояснення з цього приводу :). Люди приходять сюди, щоб побачити, чому так воно і є. Будь ласка, врахуйте пояснення Regex! Спасибі
Пратік

1
Що робити, якщо ми хочемо зберегти наголошені символи?
winzbak

169

Для символів unicode це:

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);

привіт вуандо, що з річчю / ui .. як це ти називаєш? хтось може, будь ласка, пролити мені трохи світла. Дякую.
kebyang

4
Для уточнення їх називають прапорами. Вони ставляться після розмежувача, що закривається (у цьому випадку це "/", але це може бути "~" або "@" або будь-який символ, який ви хочете використовувати, доки роздільники відкривання та закриття однакові) і змінюють поведінка виразу.
Doktor J

1
Btw, \wвключає \dі так, \dце зайве. Крім того, це неправильно, оскільки він також залишить підкреслення в отриманій рядку (яка також включена в \w).
смать

2
У цьому все ще є помилка, класи символів повинні бути закінчені символом ':]', тому правильним рядком буде: preg_replace ("/ [^ [: alnum:] [: space:]] / ui", '', $ string);
h00ligan

4
Чи iпрапор тут справді необхідний, оскільки він [:alnum:]вже охоплює обидва випадки?
billynoah

50

Регулярне вираження - це ваша відповідь.

$str = preg_replace('/[^a-z\d ]/i', '', $str);
  • iЧи означає нечутливі до регістру.
  • ^ означає, не починається з.
  • \d відповідає будь-якій цифрі.
  • a-zвідповідає всім символам між aта z. Через iпараметр вам не потрібно вказувати a-zі A-Z.
  • Після \dтого, як є пробіл, значить пробіли дозволені в цьому регулярному вираженні.

3
Ми хочемо пояснення з цього приводу :). Люди приходять сюди, щоб побачити, чому так воно і є. Будь ласка, врахуйте пояснення Regex! Не всі є достатньо передовими, щоб знати, що ви там написали без пояснень. Спасибі
Пратік

@PratikCJoshi Я розшифровує регістр. ^ означає, не починається з. \ d відповідає будь-якій цифрі. az відповідає всім символам між a і z. Через параметр i вам не потрібно вказувати az та AZ. Після \ d є пробіл, тому пробіли дозволені в цьому регулярному виразі.
барт

1
Люди не читають коментарі як відповідь. Будь ласка, оновіть відповідь!
Пратік

18

ось справді простий регулярний вираз для цього:

\W|_

і використовується в міру необхідності (з /роздільником обмежувача вперед ).

preg_replace("/\W|_/", '', $string);

Перевірте це за допомогою цього чудового інструменту, який пояснює, що робить регулярний вираз:

http://www.regexr.com/


1
Вам ще потрібен /uпрапор, інакше букви, що не належать до асацій, також видаляються.
Xeoncross

Акуратно, але також відповідатиме пробілам, і якщо цього потрібно, можливо, можна подвоїти продуктивність за допомогою класу символів та додаткового кількісного показника для одного або декількох [\W_]+
міхурних

18

Якщо вам потрібно підтримувати інші мови замість типового AZ, ви можете використовувати наступні:

preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
  • [^\p{L}\p{N} ]визначає заперечений (Він буде відповідати символу, який не визначений), клас символів:
    • \p{L}: лист з будь-якої мови.
    • \p{N}: числовий символ у будь-якому сценарії.
    • : космічний персонаж.
  • + жадібно відповідає класу символів від 1 до необмеженого разу.

Це збереже літери та цифри з інших мов та сценаріїв, а також AZ:

preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界

Примітка. Це дуже старе, але все ще актуальне питання. Я відповідаю суто для надання додаткової інформації, яка може бути корисною для майбутніх відвідувачів.


8
[\W_]+

 

$string = preg_replace("/[\W_]+/u", '', $string);

Він вибирає все не AZ, az, 0-9 і видаляє його.

Дивіться приклад тут: https://regexr.com/3h1rj


1
що означає це регулярне вираження / [\ W _] + / u?
Венло Ріго

\W- це зворотне значення \wсимволів A-Za-z0-9_. Так \Wбуде відповідати будь-який персонаж, який не є, A-Za-z0-9_і видалити їх. []Є набір символів кордону . +Надлишкова на безлічі символів кордону , але зазвичай означає 1 або більше символів. uПрапор розширює вираз , щоб включити підтримку юникода характер, тобто він не буде видаляти символи за межами коду символу 255 , наприклад , як ª²³µ. Приклад різних звичаїв 3v4l.org/hSVV5 з символами unicode та ascii.
fyrye


0

Я теж шукав відповідь, і я мав намір очистити кожну не-альфа, і не повинно бути більше одного місця.
Отже, я змінив відповідь Алекса на це, і це працює для мене preg_replace('/[^a-z|\s+]+/i', ' ', $name)
. Регекс вище звернувся sy8ed sirajul7_islamдо sy ed sirajul islam
Пояснення: Регекс перевіряє НЕ БУДЬ-ЯКОГО від a до z у випадку нечутливості або більше одного білого простору, і він буде перетворений на єдиний простір.


-2

Ви можете розділити рядок на символи і відфільтрувати його.

<?php 

function filter_alphanum($string) {
    $characters = str_split($string);
    $alphaNumeric = array_filter($characters,"ctype_alnum");
    return join($alphaNumeric);
}

$res = filter_alphanum("a!bc!#123");
print_r($res); // abc123

?>

Причина знищення: 3v4l.org/fqLVZ Крім того, виклик (3 + N) функцій у рядку невідомої довжини здається дійсно непривабливим порівняно з одним та простим preg_replace()викликом.
mickmackusa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.