Мне нужно регулярное выражение, чтобы проверить, содержит ли строка только числа, буквы, дефисы или символ подчеркивания
$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"; }
Объяснение:
Модификатор «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 }
Объяснение:
Обратите внимание, что если дефис является последним символом в определении класса, его не нужно экранировать . Если тире появляется в другом месте определения класса, ее нужно экранировать , поскольку она будет восприниматься как символ диапазона, а не дефис.
Зачем использовать регулярное выражение? 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