2011-10-13 44 views

Trả lời

77

Code:

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

Giải thích:

  • [] => định nghĩa lớp ký tự
  • ^=> phủ lớp
  • az => ký tự từ 'a' đến 'z'
  • _ => nhấn
  • - => gạch nối '-' (Bạn cần phải thoát khỏi nó)
  • 0-9 => số (từ số không đến chín)

Trình sửa đổi 'i' ở cuối regex là 'không phân biệt chữ hoa chữ thường' nếu bạn không đặt, bạn sẽ cần thêm các ký tự viết hoa trong mã trước khi thực hiện AZ

+0

điều này cho phép ký tự Trung Quốc chẳng hạn như "你好" dù sao để kiểm tra điều này? – aahhaa

+2

@wlin bạn cần phải thêm '\ x {4e00} - \ x {9fa5}' vào định nghĩa lớp charecter, cũng thêm biến tố 'u' để xử lý chuỗi và mẫu là UTF-8. Nó sẽ giống như thế này '/ [^ a-z _ \ - 0-9 \ x {4e00} - \ x {9fa5}]/ui' bạn có thể kiểm tra ở đây: https://xrg.es/#1qvtb7n – SERPRO

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

can bạn giải thích 'w' là gì? Tôi không hiểu rõ điều này –

+0

Ký tự chữ và số cộng "_" tức là [A-Za-z0-9_] – matino

+2

@matino: Bạn cần phải neo regex của mình, trừ khi nó sẽ khớp với 'a; b' – Toto

-1

Tại sao sử dụng regex? PHP có một số được xây dựng trong chức năng để làm điều đó

<?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) sẽ kiểm tra dung lượng trống

!ctype_alnum(str_replace($valid_symbols, '', $string1)) sẽ kiểm tra valid_symbols

1

\w\- có lẽ là tốt nhất nhưng đây chỉ là một thay thế
Sử dụng [:alnum:]

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

demo1 | demo2

0

Dưới đây là một phương pháp phi regex sôi nổi bằng str_word_count():

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

Xem Demo Link nơi tôi thấy làm thế nào đầu vào khác nhau dẫn đến mảng đầu ra khác nhau.

0

Dưới đây là một câu tương đương với câu trả lời được chấp nhận cho thế giới UTF-8.

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

Giải thích:

  • [] => lớp nhân vật nét
  • p {L} => phù hợp với bất kỳ loại nhân vật lá thư từ bất kỳ ngôn ngữ
  • p {N} => trận đấu bất kỳ loại ký tự số nào
  • _- => khớp với dấu gạch dưới và dấu gạch nối
  • + => Trình định lượng - Kết hợp từ một đến lần không giới hạn (tham lam)
  • /u => Bộ sửa đổi Unicode. Các chuỗi mẫu được coi là UTF-16.Cũng nguyên nhân thoát khỏi chuỗi để phù hợp với các ký tự unicode

Lưu ý, rằng nếu các gạch nối là ký tự cuối cùng trong định nghĩa lớp nó không cần phải được thoát. Nếu dấu gạch ngang xuất hiện ở nơi khác trong định nghĩa lớp, nó cần phải được thoát ra , cần được thoát ra, vì nó sẽ được xem như một ký tự phạm vi chứ không phải dấu gạch nối.

Các vấn đề liên quan