2012-05-26 76 views
5

Hiện nay, tôi đang sử dụng này:Regex để phù hợp với ký tự chữ, dấu gạch dưới, dấu chấm và dấu gạch ngang, cho phép dấu chấm và dấu gạch ngang chỉ ở giữa

if (preg_match ('/^[a-zA-Z0-9_]+([a-zA-Z0-9_]*[.-]?[a-zA-Z0-9_]*)*[a-zA-Z0-9_]+$/', $product)) { 
return true; 
} else { 
return false 
} 

Ví dụ, tôi muốn để phù hợp với:

  1. pro.duct-name_
  2. _pro.duct.name
  3. p.r.o.d_u_c_t.n-a-m-e

Nhưng tôi không muốn để phù hợp với:

  1. pro..ductname
  2. .productname-
  3. -productname.
  4. -productname
+1

câu hỏi là gì? –

+0

Đã chỉnh sửa các ví dụ để dễ hiểu hơn. Liệu nó cần giải thích thêm. Xin vui lòng cho tôi biết, tôi sẽ vui mừng làm rõ hơn nữa. – banskt

+0

Tại sao không nên 'pro..ductname' khớp? Các chấm nằm ở giữa? –

Trả lời

9

Câu trả lời sẽ là

/^[a-zA-Z0-9_]+([-.][a-zA-Z0-9_]+)*$/ 

nếu chỉ có bạn cho phép chuỗi có chứa .--. KHÔNG để phù hợp. Tại sao bạn sẽ cho phép họ để phù hợp, dù sao? Nhưng nếu bạn thực sự cần những dây để phù hợp với quá, một giải pháp khả thi là

/^[a-zA-Z0-9_]+((\.(-\.)*-?|-(\.-)*\.?)[a-zA-Z0-9_]+)*$/ 

Single . hoặc - của regex đầu tiên được thay thế bằng một chuỗi các xen kẽ .-, bắt đầu với một trong hai . hoặc -, tùy chọn theo sau là -. hoặc .- cặp tương ứng, theo sau là - hoặc . tương ứng, để cho phép một số chẵn xen kẽ. Sự phức tạp này có lẽ là một sự vượt qua, nhưng dường như là cần thiết bởi các thông số kỹ thuật hiện tại. Nếu một tối đa của 2 xen kẽ .- là cần thiết, regex trở thành

/^[a-zA-Z0-9_]+((\.-?|-\.?)[a-zA-Z0-9_]+)*$/ 

thử nghiệm here hoặc here

+0

Thứ hai thực sự hoạt động. Cảm ơn rất nhiều, mặc dù tôi phải thừa nhận, tôi không hoàn toàn hiểu được trình tự của regex thứ hai của bạn. – banskt

+0

Tôi đã chỉnh sửa câu trả lời để làm rõ –

+0

Cảm ơn bạn đã giải thích. – banskt

3

Hãy thử điều này

(?im)^([a-z_][\w\.\-]+)(?![\.\-])\b 

CẬP NHẬT 1

(?im)^([a-z_](?:[\.\-]\w|\w)+(?![\.\-]))$ 

CẬP NHẬT 2

(?im)^([a-z_](?:\.\-\w|\-\.\w|\-\w|\.\w|\w)+)$ 

Giải thích

<!-- 
(?im)^([a-z_](?:\.\-\w|\-\.\w|\-\w|\.\w|\w)+)$ 

Match the remainder of the regex with the options: case insensitive (i);^and $ match at line breaks (m) «(?im)» 
Assert position at the beginning of a line (at beginning of the string or after a line break character) «^» 
Match the regular expression below and capture its match into backreference number 1 «([a-z_](?:\.\-\w|\-\.\w|\-\w|\.\w|\w)+)» 
    Match a single character present in the list below «[a-z_]» 
     A character in the range between “a” and “z” «a-z» 
     The character “_” «_» 
    Match the regular expression below «(?:\.\-\w|\-\.\w|\-\w|\.\w|\w)+» 
     Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
     Match either the regular expression below (attempting the next alternative only if this one fails) «\.\-\w» 
     Match the character “.” literally «\.» 
     Match the character “-” literally «\-» 
     Match a single character that is a “word character” (letters, digits, and underscores) «\w» 
     Or match regular expression number 2 below (attempting the next alternative only if this one fails) «\-\.\w» 
     Match the character “-” literally «\-» 
     Match the character “.” literally «\.» 
     Match a single character that is a “word character” (letters, digits, and underscores) «\w» 
     Or match regular expression number 3 below (attempting the next alternative only if this one fails) «\-\w» 
     Match the character “-” literally «\-» 
     Match a single character that is a “word character” (letters, digits, and underscores) «\w» 
     Or match regular expression number 4 below (attempting the next alternative only if this one fails) «\.\w» 
     Match the character “.” literally «\.» 
     Match a single character that is a “word character” (letters, digits, and underscores) «\w» 
     Or match regular expression number 5 below (the entire group fails if this one fails to match) «\w» 
     Match a single character that is a “word character” (letters, digits, and underscores) «\w» 
Assert position at the end of a line (at the end of the string or before a line break character) «$» 
--> 

Và bạn có thể thử nghiệm nó here.

+1

\ w không giống như [a-zA-Z0-9_] –

+0

kiểm tra cho thấy nó không hoạt động –

+0

Tôi không biết nếu đây là những gì @Walter đề cập đến, nhưng để xây dựng một chút, [ Hướng dẫn sử dụng PHP] (http://www.php.net/manual/en/regexp.reference.escape.php) cho biết: ký tự _A "word" là bất kỳ chữ cái hoặc chữ số nào hoặc ký tự gạch dưới, nghĩa là bất kỳ ký tự nào có thể là một phần của từ "Perl". Định nghĩa các chữ cái và chữ số được điều khiển bởi các bảng ký tự của PCRE và có thể thay đổi nếu phù hợp với từng miền cụ thể đang diễn ra. Ví dụ: trong ngôn ngữ "fr" (tiếng Pháp), một số mã ký tự lớn hơn 128 được sử dụng cho các chữ cái có dấu và các mã này được khớp với \ w._ – Herbert

0
/^[A-Z0-9_][A-Z0-9_.-]*[A-Z0-9_]$/i 

Điều này đảm bảo ký tự đầu tiên và cuối cùng không phải là dấu gạch ngang hoặc dấu chấm; phần còn lại ở giữa có thể bao gồm bất kỳ ký tự nào (trong tập hợp bạn đã chọn).

0

Regex bên dưới sẽ kiểm tra bất kỳ chuỗi nào chứa ký tự, số, dấu gạch ngang, v.v ... và chỉ một dấu chấm ở giữa.

/^[A-Za-z0-9_-]+(\.){1}[A-Za-z0-9_-]+$/i 

hy vọng điều này giúp

1

này nên làm:

/^[A-z0-9_]([.-]?[A-Z0-9_]+)*[.-]?[A-z0-9_]$/ 

Nó sẽ đảm bảo rằng các chữ bắt đầu và kết thúc với chữ và số hoặc gạch chân nhân vật. Dấu ngoặc ở giữa sẽ đảm bảo rằng sẽ có nhiều nhất một dấu chấm hoặc dấu gạch ngang liên tiếp, theo sau là ít nhất một ký tự chữ và số hoặc dấu gạch dưới.

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