PHP preg_match - разрешать только буквенно-цифровые строки и символы - _ - PullRequest
25 голосов
/ 13 октября 2011

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

$string1 = "This is a string*";
$string2 = "this_is-a-string";

if(preg_match('******', $string1){
   echo "String 1 not acceptable acceptable";
   // String2 acceptable
}

Ответы [ 6 ]

84 голосов
/ 13 октября 2011

Код:

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

Пояснение:

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

Модификатор 'i' в конце регулярного выражения предназначен для 'без учета регистра', если вы не укажете, что вам нужно будет добавить символы верхнего регистра в коде, выполнив A-Z

18 голосов
/ 13 октября 2011
if(!preg_match('/^[\w-]+$/', $string1)) {
   echo "String 1 not acceptable acceptable";
   // String2 acceptable
}
3 голосов
/ 25 сентября 2017

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

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

Объяснение:

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

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

2 голосов
/ 31 августа 2017

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

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

demo1 | demo2

0 голосов
/ 01 сентября 2017

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

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

Просмотр демонстрационной ссылки , где я показываю, как разные входы приводят к разным выходным массивам.

0 голосов
/ 03 июня 2017

Зачем использовать регулярные выражения?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

...