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
}
Ответы
Ответ 1
Код:
if(preg_match('/[^a-z_\-0-9]/i', $string))
{
echo "not valid string";
}
Объяснение:
- [] => определение класса символа
- ^ => отрицать класс
- az => символы от 'a' до 'z'
- _ => подчеркивание
- - => дефис '-' (вам нужно избегать этого)
- 0-9 => номера (от нуля до девяти)
Модификатор "i" в конце регулярного выражения предназначен для "без учета регистра", если вы не ставите, что вам нужно будет добавлять символы верхнего регистра в код раньше, выполнив AZ
Ответ 2
if(!preg_match('/^[\w-]+$/', $string1)) {
echo "String 1 not acceptable acceptable";
// String2 acceptable
}
Ответ 3
\w\-
вероятно, лучший, но здесь просто другая альтернатива
Использовать [:alnum:]
if(!preg_match("/[^[:alnum:]\-_]/",$str)) echo "valid";
demo1 | demo2
Ответ 4
Вот фанковый метод без регулярного выражения с использованием str_word_count():
if($string===str_word_count($string,1,'-_0...9')[0]){
// ^^^^^^^--- characters to allow, see documentation
echo "pass";
}else{
echo "fail";
}
Просмотрите демо-ссылку, где я покажу, как разные входы приводят к разным массивам вывода.
Ответ 5
Вот один из эквивалентов принятого ответа для мира 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
Обратите внимание, что если дефис является последним символом в определении класса, его не нужно экранировать. Если тире появляется в другом месте определения класса, ее нужно экранировать, поскольку она будет восприниматься как символ диапазона, а не дефис.
Ответ 6
Зачем использовать регулярное выражение? 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