Відповіді:
Схоже, ви майже знали, що вже хочете зробити, ви в основному визначили це як регулярний вираз.
preg_replace("/[^A-Za-z0-9 ]/", '', $string);
preg_replace('/[^A-Za-z0-9 ]/', '', $string);
Для символів unicode це:
preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
\w
включає \d
і так, \d
це зайве. Крім того, це неправильно, оскільки він також залишить підкреслення в отриманій рядку (яка також включена в \w
).
i
прапор тут справді необхідний, оскільки він [:alnum:]
вже охоплює обидва випадки?
Регулярне вираження - це ваша відповідь.
$str = preg_replace('/[^a-z\d ]/i', '', $str);
i
Чи означає нечутливі до регістру.^
означає, не починається з. \d
відповідає будь-якій цифрі. a-z
відповідає всім символам між a
та z
. Через i
параметр вам не потрібно вказувати a-z
і A-Z
.\d
того, як є пробіл, значить пробіли дозволені в цьому регулярному вираженні.ось справді простий регулярний вираз для цього:
\W|_
і використовується в міру необхідності (з /
роздільником обмежувача вперед ).
preg_replace("/\W|_/", '', $string);
Перевірте це за допомогою цього чудового інструменту, який пояснює, що робить регулярний вираз:
/u
прапор, інакше букви, що не належать до асацій, також видаляються.
[\W_]+
Якщо вам потрібно підтримувати інші мови замість типового 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} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界
Примітка. Це дуже старе, але все ще актуальне питання. Я відповідаю суто для надання додаткової інформації, яка може бути корисною для майбутніх відвідувачів.
[\W_]+
$string = preg_replace("/[\W_]+/u", '', $string);
Він вибирає все не AZ, az, 0-9 і видаляє його.
Дивіться приклад тут: https://regexr.com/3h1rj
\W
- це зворотне значення \w
символів A-Za-z0-9_
. Так \W
буде відповідати будь-який персонаж, який не є, A-Za-z0-9_
і видалити їх. []
Є набір символів кордону . +
Надлишкова на безлічі символів кордону , але зазвичай означає 1 або більше символів. u
Прапор розширює вираз , щоб включити підтримку юникода характер, тобто він не буде видаляти символи за межами коду символу 255 , наприклад , як ª²³µ
. Приклад різних звичаїв 3v4l.org/hSVV5 з символами unicode та ascii.
preg_replace("/\W+/", '', $string)
Ви можете протестувати його тут: http://regexr.com/
Я теж шукав відповідь, і я мав намір очистити кожну не-альфа, і не повинно бути більше одного місця.
Отже, я змінив відповідь Алекса на це, і це працює для мене
preg_replace('/[^a-z|\s+]+/i', ' ', $name)
. Регекс вище звернувся sy8ed sirajul7_islam
до sy ed sirajul islam
Пояснення: Регекс перевіряє НЕ БУДЬ-ЯКОГО від a до z у випадку нечутливості або більше одного білого простору, і він буде перетворений на єдиний простір.
Ви можете розділити рядок на символи і відфільтрувати його.
<?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
?>
preg_replace()
викликом.