2009-09-03 37 views
15

thể trùng lặp:
How can I convert ereg expressions to preg in PHP?Làm thế nào để thay đổi eregi PHP để preg_match

tôi cần sự giúp đỡ, dưới đây là một regex RẤT cơ bản nhỏ để phần nào xác nhận email, tôi nhận ra nó không làm việc tốt nhất nhưng đối với nhu cầu của tôi, nó là ok cho bây giờ.

Nó hiện đang sử dụng chức năng eregi PHP mà php.net nói bây giờ là một chức năng khấu hao và tôi nên sử dụng preg_match thay vào đó, chỉ đơn giản là thay thế erei với preg_match không làm việc, ai đó có thể chỉ cho tôi cách để làm cho nó hoạt động?

function validate_email($email) { 
    if (!eregi("^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$", $email)) { 
     echo 'bad email'; 
    } else { 
     echo 'good email'; 
    } 
} 
function validate_email($email) { 
    if (!preg_match("^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$", $email)) { 
     echo 'bad email'; 
    } else { 
     echo 'good email'; 
    } 
} 
+0

Lưu ý rằng bạn không nên sử dụng regex này để xác nhận e-mail; nó đã lỗi thời nghiêm trọng. – Piskvor

+0

@Piskvor Tôi đồng ý, câu hỏi này là gần 5 tuổi quá =) bạn nên đăng câu trả lời cập nhật nếu bạn thích và tôi luôn có thể thay đổi câu trả lời "đã chọn" thành phương pháp tốt nhất – JasonDavis

+0

Đó là IMHO bên ngoài phạm vi của ereg/vấn đề preg; nhận xét dường như đủ cho tôi. – Piskvor

Trả lời

25

Mẫu regex kiểu Perl luôn cần phải được phân tách. Nhân vật đầu tiên trong chuỗi được coi là dấu phân cách, vì vậy một cái gì đó như thế này:

function validate_email($email) { 
    if (!preg_match("/^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i", $email)) { 
     echo 'bad email'; 
    } else { 
     echo 'good email'; 
    } 
} 

Lý do nỗ lực ban đầu của bạn không làm việc là bởi vì nó đã cố gắng sử dụng ^ như nhân vật delimiter nhưng (rõ ràng) được tìm thấy không khớp với ^ cho phần cuối của regex.

+0

Cảm ơn, tôi chỉ tìm thấy FILTER_VALIDATE_EMAIL của php, có vẻ như đó là cách tốt nhất để đi nhưng tôi không thể tìm thấy nhiều thông tin về nó – JasonDavis

+2

@jasondavis, 'FILTER_VALIDATE_EMAIL' chắc chắn sẽ là lựa chọn tốt hơn. E-mail ** phức tạp **. – TRiG

10

Bạn sẽ cần phải thay đổi ba điều

  1. cần phải thêm delimiters mẫu (có thể là bất kỳ nhân vật, nhưng phổ biến nhất là một dấu gạch chéo)
  2. [[: alnum:]] sẽ cần phải được thay thế với PCRE tương đương
  3. Chữ "i" trong "eregi" có nghĩa là phân biệt chữ hoa chữ thường, mà PCRE làm với cờ, đặc biệt là cờ i.

Nếu không, phần còn lại trông PCRE tương thích (có, đó là loại dư thừa = P)

"/^[a-z0-9][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i" 
+1

PCRE của PHP bao gồm những thứ như [: alnum:] làm tùy chọn. – Amber

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