PHP preg_match – разрешить буквенно-цифровые строки и – _ символов

Мне нужно регулярное выражение, чтобы проверить, содержит ли строка только числа, буквы, дефисы или символ подчеркивания

$string1 = "This is a string*"; $string2 = "this_is-a-string"; if(preg_match('******', $string1){ echo "String 1 not acceptable acceptable"; // String2 acceptable } 

Код:

 if(preg_match('/[^a-z_\-0-9]/i', $string)) { echo "not valid string"; } 

Объяснение:

  • [] => определение класса символа
  • ^ => отрицать класс
  • az => символы от 'a' до 'z'
  • _ => подчеркивание
  • – => дефис '-' (вам нужно избегать этого)
  • 0-9 => номера (от нуля до девяти)

Модификатор «i» в конце регулярного выражения предназначен для «без учета регистра», если вы не ставите, что вам нужно будет добавлять символы верхнего регистра в код раньше, выполнив AZ

 if(!preg_match('/^[\w-]+$/', $string1)) { echo "String 1 not acceptable acceptable"; // String2 acceptable } 

\w\- вероятно, лучший, но здесь просто другая альтернатива
Использовать [:alnum:]

 if(!preg_match("/[^[:alnum:]\-_]/",$str)) echo "valid"; 

demo1 | demo2

Вот фанковый метод без регулярного выражения с использованием str_word_count () :

 if($string===str_word_count($string,1,'-_0...9')[0]){ // ^^^^^^^--- characters to allow, see documentation echo "pass"; }else{ echo "fail"; } 

Просмотрите демо-ссылку, где я покажу, как разные входы приводят к разным массивам вывода.

Вот один из эквивалентов принятого ответа для мира UTF-8.

 if (!preg_match('/^[\p{L}\p{N}_-]+$/u', $string)){ //Disallowed Character In $string } 

Объяснение:

  • [] => определение класса символа
  • p {L} => соответствует любому символу букв с любого языка
  • p {N} => соответствует любому виду числового символа
  • _- => соответствует символу подчеркивания и дефиса
  • + => Квантификатор – Соответствует между одним и неограниченным временем (жадным)
  • / u => Модификатор Unicode. Строки шаблонов рассматриваются как UTF-16. Также приводит к тому, что escape-последовательности соответствуют символам Unicode

Обратите внимание, что если дефис является последним символом в определении класса, его не нужно экранировать . Если тире появляется в другом месте определения класса, ее нужно экранировать , поскольку она будет восприниматься как символ диапазона, а не дефис.

Зачем использовать регулярное выражение? PHP имеет некоторые встроенные функции для этого.

 <?php $valid_symbols = array('-', '_'); $string1 = "This is a string*"; $string2 = "this_is-a-string"; if(preg_match('/\s/',$string1) || !ctype_alnum(str_replace($valid_symbols, '', $string1))) { echo "String 1 not acceptable acceptable"; } ?> 

preg_match('/\s/',$username) будет проверять пробел

!ctype_alnum(str_replace($valid_symbols, '', $string1)) проверит на valid_symbols