2011-10-13 3 views
24

мне нужно регулярное выражение, чтобы проверить, если строка содержит только цифры, буквы, знаки дефиса или подчеркивания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 
} 

ответ

77

Код:

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

Объяснение:

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

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

+0

это позволяет китайскому персонажу, например, «你好», так или иначе, чтобы проверить это? – aahhaa

+2

@wlin вам нужно добавить '\ x {4e00} - \ x {9fa5}' в определение класса charecter, также добавить модификатор 'u' для обработки строки и шаблона как UTF-8. Это будет выглядеть так: '/ [^ a-z _ \ - 0-9 \ x {4e00} - \ x {9fa5}]/ui' вы можете проверить здесь: https://xrg.es/#1qvtb7n – SERPRO

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

can вы объясните, что такое 'w'? Я не совсем понимаю это –

+0

Буквенно-цифровые символы плюс «_» т.е. [A-Za-z0-9_] – matino

+2

@matino: вам нужно привязать ваше регулярное выражение, если оно не будет соответствовать 'a; b' – Toto

-1

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

1

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

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

demo1 | demo2

0

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

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

Demo Link Посмотреть, где я показываю, как различные входы в результате различных выходных массивов.

0

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

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

Пояснение:

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

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

Смежные вопросы