Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Web Development
Code

8 Biểu thức Chính quy Bạn nên biết

by
Difficulty:IntermediateLength:LongLanguages:

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Biểu thức chính quy (hay còn gọi là regex) bản thân nó là một ngôn ngữ. Khi bạn học một ngôn ngữ lập trình mới, chúng là ngôn ngữ phụ nhỏ này, thoạt nhìn bạn không nhận ra. Nhiều lần bạn phải đọc hướng dẫn, bài viết hoặc sách khác chỉ để hiểu cái mẫu "đơn giản" được mô tả. Hôm nay, chúng ta sẽ xem xét tám biểu thức chính quy mà bạn nên biết cho dự án lập trình tiếp theo của bạn.

Trước khi bắt đầu, bạn có thể muốn xem qua một số ứng dụng regex trên Envato Market, chẳng hạn như:

RegEx Extractor

Bạn có thể trích xuất email, proxy, IP, số điện thoại, địa chỉ, thẻ HTML, URL, liên kết, ngày tháng, v.v. Chỉ cần chèn một hoặc nhiều biểu thức chính quy và URL nguồn, và bắt đầu quá trình.

Trích xuất, thu thập, phân tích.

Ví dụ Sử dụng

  • Giải nén các email từ sổ địa chỉ CSV cũ.
  • Trích xuất nguồn hình ảnh từ các tập tin HTML.
  • Trích xuất proxy từ các trang web trực tuyến.
  • Trích xuất các kết quả URL từ Google.

PHP Regular Expression Tester

  1. Kiểm tra regex nhanh chóng
  2. Dựa trên AJAX
  3. Không bắt buộc jQuery.
  4. Không yêu cầu cơ sở dữ liệu
  5. Kèm quảng cáo

MyRegExp

Đây là một trình tạo RegEx trong PHP, giúp bạn xây dựng các biểu thức chính quy trong một cú pháp PHP mở rộng. Bạn có thể:

  1. Xây dựng các Biểu thức Chính quy với một cú pháp PHP đơn giản
  2. Xác nhận tính hợp lệ của các chuỗi với RegEx
  3. Xây dựng các biểu thức RegEx và lấy chúng
  4. Áp dụng preg_match vào một RegEx
  5. Thay thế một chuỗi với RegEx

Tất cả những điều đó đều trong một cú pháp PHP. Không còn phải nặn ốc để cố gắng tạo RegEx cơ bản hoặc phức tạp!


Cơ bản về Biểu thức Chính quy

Đây là những gì mà Wikipedia đã nói về chúng:

Trong tính toán, những Biểu thức Chính quy cung cấp một phương tiện gọn gàng và linh hoạt để xác định các chuỗi của văn bản mà bạn quan tâm, chẳng hạn như các ký tự đặc biệt, từ hoặc mẫu ký tự. Biểu thức Chính quy (hay là regex hoặc regexp, hoặc regexen) được viết bằng một ngôn ngữ hình thức có thể được dịch bởi một trình xử lý Biểu thức Chính quy, một chương trình phục vụ như là một trình tạo phân tích cú pháp hoặc kiểm tra văn bản và xác định các phần khớp với đặc tả đã cung cấp.

Bây giờ, điều đó không thực sự cho tôi biết nhiều về các mẫu thật sự. Các regex mà tôi sẽ khái quát trong ngày hôm nay có chứa các ký tự như \w, \s, \1, và nhiều cái khác đại diện cho một cái gì đó hoàn toàn khác với chính chúng.

Nếu bạn muốn tìm hiểu một chút về Biểu thức Chính quy trước khi bạn tiếp tục đọc bài viết này, tôi khuyên bạn nên xem loạt video hướng dẫn Biểu thức Chính quy dành cho Người mới bắt đầu.

Tám Biểu thức Chính quy mà chúng ta sẽ tìm hiểu trong ngày hôm nay sẽ cho phép bạn so khớp một hay nhiều: tên người dùng, mật khẩu, email, giá trị hex (ví dụ #fff hoặc # 000), slug, URL, địa chỉ IP và một thẻ HTML. Càng về sau, các biểu thức chính quy cho chúng sẽ càng trở nên khó hiểu. Hình dung về mỗi regex ngay từ cái ban đầu rất dễ thực hiện, nhưng bốn cái cuối cùng càng dễ hiểu hơn bằng cách đọc phần giải thích.

Điều quan trọng cần nhớ về biểu thức chính quy là chúng gần như được đọc tới và lui cùng một lúc. Câu này sẽ rõ hơn khi chúng ta nói về việc khớp các thẻ HTML.

Lưu ý: Dấu phân cách được sử dụng trong các biểu thức chính quy là dấu gạch chéo, "/". Mỗi mẫu bắt đầu và kết thúc với một dấu phân cách. Nếu một dấu gạch chéo xuất hiện trong một regex, thì chúng ta phải thoát nó bằng dấu gạch chéo ngược: "\/".


1. Khớp một Tên người dùng

Matching a username

Mẫu:

Mô tả:

Chúng ta bắt đầu bằng cách nói với trình phân tích cú pháp tìm đầu chuỗi (^), tiếp theo là bất kỳ chữ cái thường (a-z), con số (0-9), một dấu gạch dưới, hoặc một dấu gạch nối. Tiếp theo, {3,16} đảm bảo có ít nhất 3 trong số các ký tự đó, nhưng không quá 16. Cuối cùng, chúng ta kết thúc chuỗi ($).

Chuỗi khớp:

my-us3r_n4m3

Chuỗi không khớp:

th1s1s-wayt00_l0ngt0beausername (quá dài)


2. Khớp một Mật khẩu

Matching a password

Mẫu:

Mô tả:

Khớp một mật khẩu rất giống với việc khớp một tên người dùng. Sự khác biệt duy nhất là thay vì 3 đến 16 chữ cái, các con số, dấu gạch dưới hoặc dấu gạch ngang, thì chúng ta muốn 6 đến 18 trong số đó ({6,18}).

Chuỗi khớp:

myp4ssw0rd

Chuỗi không khớp:

mypa$$w0rd (chứa một dấu đô la)


3. Khớp một Giá trị Hex

Matching a hex valud

Mẫu:

Mô tả:

Chúng ta bắt đầu bằng cách nói cho trình phân tích cú pháp tìm đầu chuỗi (^). Tiếp theo, một ký hiệu con số là tùy chọn bởi vì nó được theo sau một dấu chấm hỏi. Dấu chấm hỏi nói cho trình phân tích cú pháp rằng ký tự trước — trong trường hợp này một ký hiệu số — là tùy chọn, nhưng phải nắm bắt nó nếu nó ở đó. Tiếp theo, bên trong nhóm đầu tiên (nhóm dấu ngoặc đơn đầu tiên), chúng ta có thể có hai tình huống khác nhau. Đầu tiên là bất kỳ chữ cái cái thường giữa a và f hoặc một con số sáu lần. Dấu gạch đứng cho chúng ta biết rằng chúng ta cũng có thể có ba chữ cái viết thường giữa a và f hoặc con số. Cuối cùng, chúng ta kết thúc chuỗi ($).

Lý do tôi đặt sáu ký tự phía trước đó là trình phân tích cú pháp sẽ bắt một giá trị hex giống như #ffffff. Nếu tôi đảo ngược nó để ba ký tự ở phía trước, thì trình phân tích cú pháp sẽ chỉ lấy #fff và không phải là ba f khác.

Chuỗi khớp:

#a3c113

Chuỗi không khớp:

#4d82h4 (chứa chữ h)


4. Khớp một Slug

Matching a slug

Mẫu:

Mô tả:

Bạn sẽ sử dụng regex này nếu bạn đã từng làm việc với mod_rewrite và pretty URL. Chúng ta bắt đầu bằng cách nói cho trình phân tích cú pháp tìm đầu chuỗi (^), tiếp theo là một hoặc nhiều ký tự (dấu +), số hoặc dấu gạch ngang. Cuối cùng, chúng ta kết thúc chuỗi ($).

Chuỗi khớp:

my-title-here

Chuỗi không khớp:

my_title_here (chứa dấu gạch dưới)


5. Khớp một Email

Matching an email

Mẫu:

Mô tả:

Chúng ta bắt đầu bằng cách nói cho trình phân tích cú pháp tìm đầu chuỗi (^). Trong nhóm đầu tiên, chúng ta khớp một hoặc nhiều chữ cái thường, số, dấu gạch dưới, dấu chấm hoặc dấu gạch ngang. Tôi đã thoát dấu chấm vì một dấu chấm không thoát có nghĩa là bất kỳ ký tự nào. Ngay sau đó, phải có một ký hiệu. Tiếp theo tên miền phải là: một hoặc nhiều chữ cái thường, số, dấu gạch dưới, dấu chấm hoặc dấu gạch nối. Sau đó, một dấu chấm khác (đã thoát), với phần mở rộng là từ hai đến sáu chữ cái hoặc dấu chấm. Tôi có 2 đến 6 bởi vì TLD cụ thể của quốc gia (.ny.us hoặc .co.uk). Cuối cùng, chúng ta kết thúc chuỗi ($).

Chuỗi khớp:

john@doe.com

Chuỗi không khớp:

john@doe.something (TLD quá dài)


6. Khớp một URL

Matching a url

Mẫu:

Mô tả:

Regex này gần giống như lấy phần kết thúc của regex ở trên, ném nó vào giữa "http://" và một số cấu trúc tập tin ở cuối. Nghe có vẻ đơn giản hơn nhiều so với thực tế. Để bắt đầu, chúng ta tìm kiếm đầu dòng với dấu mũ (^).

Nhóm đầu tiên thì hoàn toàn tùy chọn. Nó cho phép URL bắt đầu với "http://", "https://", hoặc không phải cả hai. Tôi có một dấu chấm hỏi phía sau s để cho phép URL có http hoặc https. Để làm cho toàn bộ nhóm này là tùy chọn, tôi chỉ cần thêm một dấu chấm hỏi vào cuối của nó.

Tiếp theo là tên miền: một hoặc nhiều số, chữ cái, dấu chấm, hoặc dấu gạch ngang theo sau bởi một dấu chấm khác sau đó từ hai đến sáu chữ cái hoặc dấu chấm. Phần theo sau là các tập tin và thư mục tùy chọn. Trong nhóm, chúng ta muốn khớp bất kỳ số lượng dấu gạch chéo, ký tự, số, dấu gạch dưới, dấu cách, dấu chấm hoặc dấu gạch nối. Sau đó, chúng ta nói rằng nhóm này có thể được kết hợp nhiều lần khi chúng ta muốn. Điều này cho phép nhiều thư mục được khớp cùng với một tập tin ở cuối. Tôi đã sử dụng dấu sao thay vì dấu chấm hỏi bởi vì dấu sao có nghĩa là không hoặc nhiều, không phải không hoặc một. Nếu một dấu chấm hỏi đã được sử dụng ở đó, chỉ có một tập tin/thư mục sẽ có thể được khớp.

Sau đó, một dấu gạch chéo được khớp, nhưng nó có thể là tùy chọn. Cuối cùng chúng ta kết thúc với dấu kết thúc dòng.

Chuỗi khớp:

https://net.tutsplus.com/about

Chuỗi không khớp:

http://google.com/some/file!.html (chứa một dấu chấm than)


7. Khớp một Địa chỉ IP

Matching an IP address

Mẫu:

Mô tả:

Bây giờ, tôi sẽ không nói dối, không phải tôi viết regex này; Tôi lấy nó từ đây. Bây giờ, điều đó không có nghĩa là tôi không thể phân tích nó.

Nhóm đầu tiên thực sự không phải là một nhóm khớp bởi vì

được đặt bên trong cái sẽ nói với trình phân tích cú pháp không khớp nhóm này (điều này sẽ rõ hơn trong regex cuối cùng). Chúng ta cũng muốn nhóm không khớp này được lặp lại ba lần — {3} ở cuối nhóm. Nhóm này chứa một nhóm khác, một nhóm con và một dấu chấm. Trình phân tích cú pháp tìm kiếm một khớp trong nhóm con sau đó một dấu chấm để tiếp tục.

Nhóm con cũng là một nhóm không khớp khác. Nó chỉ là một nhóm các bộ ký tự (những thứ bên trong ngoặc đơn): chuỗi "25" theo sau bởi một số từ 0 đến 5; hoặc chuỗi "2" và một số từ 0 đến 4 và bất kỳ số nào; hoặc một tuỳ chọn số không hoặc một theo sau bởi hai số, với cái thứ hai là tùy chọn.

Sau khi chúng ta khớp ba trong số đó, nó sẽ vào nhóm không khớp tiếp theo. Điều này muốn: chuỗi "25" theo sau bởi một số từ 0 đến 5; hoặc chuỗi "2" với một số từ 0 đến 4 và một số khác ở cuối; hoặc một tuỳ chọn số không hoặc một theo sau bởi hai số, với cái thứ hai là tùy chọn.

Chúng ta kết thúc regex khó hiểu này bằng chuỗi kết thúc.

Chuỗi khớp:

73.60.124.136 (không, đó không phải địa chỉ IP của tôi :P)

Chuỗi không khớp:

256.60.124.136 (nhóm đầu tiên phải là "25" và một số từ 0 đến 5)


8. Khớp một Thẻ HTML

Matching an HTML tag

Mẫu:

Mô tả:

Một trong những regex hữu ích trong danh sách. Nó khớp bất kỳ thẻ HTML nào cùng với nội dung bên trong. Như thường lệ, chúng ta bắt đầu bằng đầu dòng.

Đầu tiên là tên của thẻ. Nó phải dài một hoặc nhiều chữ cái. Đây là nhóm đầu tiên, nó hữu ích khi chúng ta phải lấy thẻ đóng. Điều tiếp theo là các thuộc tính của thẻ. Đây là ký tự bất kỳ nhưng không phải dấu lớn hơn (>). Vì đây là tùy chọn, nhưng tôi muốn khớp nhiều hơn một ký tự, nên dấu sao được sử dụng. Dấu cộng tạo nên thuộc tính và giá trị, và dấu sao nói lên rằng có nhiều thuộc tính.

Tiếp theo là nhóm không khớp thứ ba. Bên trong, nó sẽ chứa một dấu lớn hơn, một số nội dung, và một thẻ đóng; hoặc một số khoảng trắng, một dấu gạch chéo, và dấu lớn hơn. Tùy chọn đầu tiên sẽ tìm kiếm một dấu lớn hơn theo sau bởi bất kỳ số ký tự nào, và thẻ đóng. \1 được sử dụng để đại diện cho nội dung được khớp trong nhóm đầu tiên. Trong trường hợp này nó là tên của thẻ. Bây giờ, nếu điều đó không thể được khớp thì chúng ta cần tìm một thẻ tự đóng (như thẻ img, br hoặc hr). Điều này cần có một hoặc nhiều khoảng trắng theo sau bởi "/>".

regex được kết thúc với dấu kết thúc dòng.

Chuỗi khớp:

Nettuts">http://net.tutsplus.com/">Nettuts+

Chuỗi không khớp:

<img src="img.jpg" alt="My image>" /> (các thuộc tính không thể chứa dấu lớn hơn)


Phần tóm tắt

Tôi hy vọng rằng bạn đã hiểu rõ hơn những ý tưởng đằng sau những biểu thức chính quy. Hy vọng rằng bạn sẽ được sử dụng các regex trong các dự án trong tương lai! Bình thường bạn sẽ không cần phải giải mã một regex từng chữ một, nhưng đôi khi nếu bạn làm điều này thì nó sẽ giúp bạn học hỏi được nhiều điều. Chỉ cần nhớ, đừng sợ những biểu thức chính quy, chúng có thể khó hiểu, nhưng chúng làm cho cuộc sống của bạn trở nên dễ dàng hơn nhiều. Chỉ cần thử và kéo ra một cái tên của một thẻ từ một chuỗi mà không cần biểu thức chính quy!

Hãy theo dõi chúng tôi trên Twitter, hoặc đăng ký vào NETTUTS RSS Feed để đọc thêm các hướng dẫn và bài viết về phát triển web hàng ngày. Và kiểm tra một số ứng dụng regex trên Envato Market.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.