2012-05-08 42 views
6

Tôi cần một Regex cho PHP phải làm như sau:

tôi muốn cho phép [a- zα-ωá-źа-я ա-ֆ ა-ჰ א-ת] và các chữ cái Trung Quốc, Nhật Bản (nhiều hơn utf-8); Tôi muốn cấm [^ ٩٨٧٦٥٤٣٢١٠۰۱۲۳۴۵۶۷۸۹] (số arabic);

Đây là những gì tôi đã làm:

function isValidFirstName($first_name) { 
    return preg_match("/^(?=[a-zα-ωá-źа-яա-ֆა-ჰא-ת]+([a-zα-ωá-źа-яա-ֆა-ჰא-ת' -]+)?\z)[a-zα-ωá-źа-яա-ֆა-ჰא-ת' -]+$/i", $first_name); 
} 

Dường như nó hoạt động, nhưng nếu tôi gõ chữ của hơn 1 ngôn ngữ, nó không xác nhận.

Ví dụ: Авпа Вапапва á-ź John - không xác thực. John Gger - xác nhận, xác nhận - xác thực.

Tôi muốn tất cả những điều này.

Hoặc nếu có cách nào đó, để lặp lại thông báo nếu người dùng nhập chuỗi ngôn ngữ khác.

+1

Ngôn ngữ lập trình nào? Nó quan trọng khi chúng ta bắt đầu nói về unicode –

+0

Oh tôi xin lỗi! Php! – Hypn0tizeR

+0

xem chức năng php 'ctype_alnum' –

Trả lời

2

tôi không thể tái tạo các trường hợp thất bại ở đây (Авпа Вапапва á-ź John xác nhận tốt) , nhưng bạn có thể đơn giản hóa regex rất nhiều - bạn không cần xác nhận lookahead đó:

preg_match('/^[a-zα-ωá-źа-яա-ֆა-ჰא-ת][a-zα-ωá-źа-яա-ֆა-ჰא-ת\' -]*$/i', $first_name) 

Theo như tôi có thể biết từ các phạm vi ký tự bạn đã đưa ra, bạn không cần loại trừ các chữ số vì bất kỳ thứ gì bên ngoài các lớp ký tự này sẽ khiến cho regex thất bại.

xem xét khác: Nếu mục tiêu của bạn là để cho phép bất kỳ lá thư từ bất kỳ ngôn ngữ/script (cộng với một số dấu câu và không gian), bạn có thể (nếu bạn đang sử dụng chuỗi Unicode) tiếp tục đơn giản hóa này để:

preg_match('/^\pL[\pL\' -]*$/iu', $first_name) 

Nhưng nói chung, tôi sẽ không cố gắng xác nhận tên bằng các cụm từ thông dụng (hoặc bất kỳ phương tiện nào khác): Falsehoods programmers believe about names.

+0

Điều này làm việc tuyệt vời! – Hypn0tizeR

2

Bạn có thể lọc ra các ký tự tiếng Ả Rập bằng cách kiểm tra cách followin sử dụng RegEx:

if (preg_match('/(?:[\p{Hebrew}]+)/imu', $subject)) { 
    # Successful match 
} else { 
    # Match attempt failed 
} 

RegEx giải thích

<!-- 
(?i)(?:[\p{IsHebrew}]+) 

Options: case insensitive;^and $ match at line breaks 

Match the remainder of the regex with the options: case insensitive (i) «(?i)» 
Match the regular expression below «(?:[\p{IsHebrew}]+)» 
    A character in the Unicode block “Hebrew” (U+0590..U+05FF) «[\p{IsHebrew}]+» 
     Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
--> 
Các vấn đề liên quan