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