Biểu thức chính quy PHP

Biểu thức chính quy rất mạnh mẽ, PHP nhưng chúng không được biết là có thể đọc được và thường xuyên hơn không, việc duy trì biểu thức chính quy không phải là một nhiệm vụ đơn giản

PHP sử dụng PCRE (PCRE2 kể từ PHP 7. 3) hương vị của biểu thức chính quy và nó đi kèm với một số tính năng nâng cao có thể giúp viết các biểu thức chính quy dễ đọc, dễ hiểu và dễ duy trì. Các bộ lọc và hàm ctype của PHP cung cấp các xác thực như URL, email và các giá trị chữ và số, giúp không sử dụng biểu thức chính quy ngay từ đầu

Các IDE có thể cung cấp tính năng tô sáng cú pháp đẹp hơn để giúp làm cho một biểu thức chính quy nhất định dễ đọc hơn và dễ nắm bắt hơn, đồng thời cung cấp các bản sửa lỗi nhanh để cải thiện chúng. Tuy nhiên, viết một biểu thức chính quy dễ hiểu và dễ đọc hơn ngay từ đầu có thể hữu ích về lâu dài

Dưới đây là một số mẹo để cải thiện và viết các biểu thức chính quy tốt hơn trong PHP. Lưu ý rằng chúng có thể không hoạt động trong các phiên bản PHP cũ hơn (cũ hơn PHP 7. 3). Ngoài ra, việc sử dụng những cải tiến này cũng có nghĩa là các biểu thức chính quy có thể ít di động hơn đối với các ngôn ngữ khác. Ví dụ: được hỗ trợ ngay cả trong các phiên bản PHP cũ hơn, nhưng trong JavaScript, tính năng chụp có tên chỉ được thêm vào trong ECMAScript 2018



Mỗi và mọi biểu thức chính quy đều có hai phần. biểu thức và cờ. Cụm từ thông dụng được chứa trong hai ký tự, theo sau là các cờ tùy chọn

Hãy xem xét biểu thức chính quy bên dưới

/(foo|bar)/i

Trong bất kỳ biểu thức chính quy nào, một ký tự phân cách chứa biểu thức, theo sau là các cờ tùy chọn. Trong ví dụ trên,

- /^https:\/\/example\.com\/path/i
+ #^https://example\.com/path#i
9 là chính biểu thức và
- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
0 là cờ/công cụ sửa đổi. Ký tự
- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
1 là dấu phân cách

Dấu gạch chéo lên phía trước (

- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
1) thường được sử dụng làm dấu phân cách, nhưng nó có thể là bất kỳ ký tự nào, chẳng hạn như
- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
3,
- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
4,
- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
5,
- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
6,
- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
7, v.v. Các ký tự chữ và số (A-Z, a-z và 0-9), ký tự nhiều byte (chẳng hạn như Biểu tượng cảm xúc) và dấu gạch chéo ngược (
- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
8) không được phép làm dấu phân cách

Ngoài ra, dấu ngoặc nhọn cũng có thể được sử dụng làm dấu phân cách. Cụm từ thông dụng với

- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
9,
/Username: @[a-z\.0-9]/
0,
/Username: @[a-z\.0-9]/
1 và
/Username: @[a-z\.0-9]/
2 cũng được chấp nhận và có thể dễ đọc hơn tùy thuộc vào ngữ cảnh

Việc lựa chọn dấu phân cách là quan trọng vì tất cả các lần xuất hiện của ký tự phân cách trong biểu thức phải được thoát. Càng ít ký tự thoát trong một biểu thức chính quy, nó sẽ càng dễ đọc hơn. Không chọn ký tự meta (chẳng hạn như

/Username: @[a-z\.0-9]/
3,
- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
7, dấu ngoặc nhọn và các ký tự khác mang ý nghĩa đặc biệt trong biểu thức chính quy) có thể làm giảm số lượng ký tự thoát

Mặc dù dấu gạch chéo về phía trước phổ biến như một dấu phân cách biểu thức chính quy, nhưng nó thường không phù hợp với các biểu thức chính quy chứa URI

preg_match('/^https:\/\/example\.com\/path/i', $uri);

Dấu gạch chéo lên phía trước (

- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
1) là một lựa chọn không hợp lý về dấu phân cách trong ví dụ trên vì bản thân biểu thức cũng chứa dấu gạch chéo lên, dấu gạch chéo này hiện phải được thoát ra, dẫn đến một đoạn mã khá khó đọc

Chỉ cần chuyển dấu phân cách từ

- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
1 thành
- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
6 đã làm cho biểu thức dễ đọc hơn vì nó không còn chứa bất kỳ ký tự thoát nào

- /^https:\/\/example\.com\/path/i
+ #^https://example\.com/path#i
- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);

Tiến thêm một bước từ , có các cách tiếp cận khác để giảm số lượng ký tự thoát được sử dụng trong biểu thức chính quy

Trong các biểu thức chính quy, một số ký tự meta nhất định không được coi là ký tự meta khi chúng được sử dụng bên trong dấu ngoặc vuông (lớp ký tự). Ví dụ: các ký tự

/Username: @[a-z\.0-9]/
8,
/Username: @[a-z\.0-9]/
9,
- /Price: [0-9\-\$\.\+]+/
+ /Price: [0-9$.+-]+/ 
0 và
- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
7 (trong số những ký tự khác) mang chức năng đặc biệt trong biểu thức chính quy, nhưng không nằm trong dấu ngoặc vuông

/Username: @[a-z\.0-9]/

Trong biểu thức trên, ký tự dấu chấm (

/Username: @[a-z\.0-9]/
8) được thoát bằng dấu gạch chéo ngược (
- /Price: [0-9\-\$\.\+]+/
+ /Price: [0-9$.+-]+/ 
3), nhưng không cần thiết vì ký tự
/Username: @[a-z\.0-9]/
8 không phải là ký tự meta khi nó được sử dụng bên trong dấu ngoặc vuông

Hơn nữa, một số ký tự không cần thoát nếu chúng không thuộc phạm vi

Ví dụ: ký tự gạch ngang (

- /Price: [0-9\-\$\.\+]+/
+ /Price: [0-9$.+-]+/ 
5) biểu thị một phạm vi ký tự nếu nó được sử dụng giữa hai ký tự, nhưng nó không có chức năng đặc biệt nếu được sử dụng ở nơi khác. Trong biểu thức chính quy
- /Price: [0-9\-\$\.\+]+/
+ /Price: [0-9$.+-]+/ 
6, ký tự gạch ngang
- /Price: [0-9\-\$\.\+]+/
+ /Price: [0-9$.+-]+/ 
5 được sử dụng để tạo một phạm vi khớp từ
- /Price: [0-9\-\$\.\+]+/
+ /Price: [0-9$.+-]+/ 
8 đến
- /Price: [0-9\-\$\.\+]+/
+ /Price: [0-9$.+-]+/ 
9. Nếu ký tự gạch ngang bị thoát (
preg_match('/x\yz/X', ''); // "y" is not a special character, but escaped.
0), biểu thức chính quy chỉ khớp với các ký tự
- /Price: [0-9\-\$\.\+]+/
+ /Price: [0-9$.+-]+/ 
8,
- /Price: [0-9\-\$\.\+]+/
+ /Price: [0-9$.+-]+/ 
9 và
- /Price: [0-9\-\$\.\+]+/
+ /Price: [0-9$.+-]+/ 
5. Thay vì thoát khỏi ký tự gạch ngang (
preg_match('/x\yz/X', ''); // "y" is not a special character, but escaped.
4), chỉ cần di chuyển ký tự gạch ngang đến cuối dấu ngoặc vuông sẽ giảm số lượng ký tự cần thoát;

Việc sử dụng quá nhiều các ký tự thoát không làm cho biểu thức chính quy bị lỗi, nhưng chúng có thể làm giảm đáng kể khả năng đọc

- /Price: [0-9\-\$\.\+]+/
+ /Price: [0-9$.+-]+/ 

Có một cờ

preg_match('/x\yz/X', ''); // "y" is not a special character, but escaped.
7, làm lỗi biểu thức chính quy nếu một ký tự không có ý nghĩa đặc biệt nào bị thoát, nhưng nó không nhạy cảm với ngữ cảnh (e. g. đưa ra một lỗi tùy thuộc vào niềng răng, v.v. )

preg_match('/x\yz/X', ''); // "y" is not a special character, but escaped.
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 2 in .. on line ...

Trong biểu thức chính quy, dấu ngoặc nhọn

/Username: @[a-z\.0-9]/
0 bắt đầu một nhóm bắt giữ. Các kết quả phù hợp sẽ được chuyển đến danh sách phù hợp

Xem xét một ví dụ về biểu thức chính quy trích xuất giá từ một văn bản nhất định, từ văn bản

preg_match('/x\yz/X', ''); // "y" is not a special character, but escaped.
9

$pattern = '/Price: (£|€)(\d+)/';
$text    = 'Price: €24';
preg_match($pattern, $text, $matches);

Trong đoạn mã trên, có hai nhóm chụp. cái đầu tiên dành cho loại tiền tệ (

Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 2 in .. on line ...
0), tiếp theo là giá trị số

Biến

Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 2 in .. on line ...
1 sẽ lưu trữ các kết quả phù hợp từ cả hai nhóm chụp

var_dump($matches);
preg_match('/^https:\/\/example\.com\/path/i', $uri);
0

Đối với các biểu thức chính quy hoàn toàn không cần chụp hoặc để giới hạn số lượng kết quả khớp được truyền cho mảng

Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 2 in .. on line ...
1, một nhóm không chụp có thể giúp ích

Cú pháp của một nhóm không bắt giữ là một dấu ngoặc nhọn bắt đầu bằng

Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 2 in .. on line ...
3 và kết thúc bằng
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 2 in .. on line ...
4. Công cụ Regex xác nhận biểu thức bên trong dấu ngoặc nhọn, nhưng nó không được trả về dưới dạng đối sánh; . e. không bị bắt

Nếu biểu thức trên chỉ quan tâm đến giá trị số, nhóm chụp

Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 2 in .. on line ...
0 có thể được chuyển thành nhóm không chụp.
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 2 in .. on line ...
6

preg_match('/^https:\/\/example\.com\/path/i', $uri);
1
preg_match('/^https:\/\/example\.com\/path/i', $uri);
2

Trên các biểu thức chính quy có nhiều nhóm, việc chuyển những nhóm không sử dụng thành các nhóm không bắt giữ có thể giảm lượng dữ liệu được gán cho biến

Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 2 in .. on line ...
1

PHP8. 2 hỗ trợ công cụ sửa đổi

Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 2 in .. on line ...
8, làm cho tất cả các nhóm bắt giữ không bị bắt trừ khi chúng

Xem PHP 8. 2. Hỗ trợ công cụ sửa đổi không bắt giữ (_______46_______8) trong các hàm

$pattern = '/Price: (£|€)(\d+)/';
$text    = 'Price: €24';
preg_match($pattern, $text, $matches);
0

Tương tự như các nhóm không chụp, các ảnh chụp được đặt tên cho phép chụp một nhóm cụ thể và đặt tên cho nhóm đó. Chúng không chỉ giúp đặt tên cho các giá trị được trả về mà còn đặt tên cho chính các phần của biểu thức chính quy

Sử dụng cùng một ví dụ khớp giá ở trên, một nhóm chụp được đặt tên cho phép đặt tên cho từng nhóm chụp

preg_match('/^https:\/\/example\.com\/path/i', $uri);
3

Một nhóm chụp được đặt tên có cú pháp là

$pattern = '/Price: (£|€)(\d+)/';
$text    = 'Price: €24';
preg_match($pattern, $text, $matches);
1, theo sau là tên của nhóm và kết thúc bằng
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 2 in .. on line ...
4

Trong ví dụ trên,

$pattern = '/Price: (£|€)(\d+)/';
$text    = 'Price: €24';
preg_match($pattern, $text, $matches);
3 là một nhóm chụp được đặt tên có tên
$pattern = '/Price: (£|€)(\d+)/';
$text    = 'Price: €24';
preg_match($pattern, $text, $matches);
4 và
$pattern = '/Price: (£|€)(\d+)/';
$text    = 'Price: €24';
preg_match($pattern, $text, $matches);
5 được đặt tên là
$pattern = '/Price: (£|€)(\d+)/';
$text    = 'Price: €24';
preg_match($pattern, $text, $matches);
6. Các tên cung cấp một chút ngữ cảnh khi đọc biểu thức chính quy, nhưng cũng cung cấp một cách để đặt tên cho các giá trị trong mảng giá trị phù hợp

preg_match('/^https:\/\/example\.com\/path/i', $uri);
4
preg_match('/^https:\/\/example\.com\/path/i', $uri);
5

Mảng

Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 2 in .. on line ...
1 hiện chứa tên và giá trị vị trí của các giá trị phù hợp

Sử dụng các nhóm chụp được đặt tên giúp dễ dàng sử dụng các giá trị

Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 2 in .. on line ...
1 và dễ dàng thay đổi biểu thức chính quy sau này bằng cách giữ nguyên tên của nhóm chụp

Theo mặc định, các nhóm chụp có tên trùng lặp không được phép và dẫn đến lỗi

$pattern = '/Price: (£|€)(\d+)/';
$text    = 'Price: €24';
preg_match($pattern, $text, $matches);
9. Có thể cho phép rõ ràng các nhóm chụp có tên trùng lặp này với công cụ sửa đổi
var_dump($matches);
0

preg_match('/^https:\/\/example\.com\/path/i', $uri);
6

Với biểu thức chính quy này, có hai nhóm chụp có tên

$pattern = '/Price: (£|€)(\d+)/';
$text    = 'Price: €24';
preg_match($pattern, $text, $matches);
4 và nó được cho phép rõ ràng với cờ
var_dump($matches);
0. Khi nó được khớp với một chuỗi, nó sẽ chỉ trả về kết quả khớp cuối cùng cho giá trị chụp được đặt tên, nhưng các giá trị vị trí (
var_dump($matches);
3,
var_dump($matches);
4,
var_dump($matches);
5,. ) chứa tất cả các trận đấu

preg_match('/^https:\/\/example\.com\/path/i', $uri);
7_______17_______8

Một số biểu thức chính quy khá dài và mở rộng thành nhiều dòng

Kết hợp biểu thức chính quy trong khi nhận xét các mẫu phụ hoặc xác nhận riêng lẻ có thể cải thiện khả năng đọc và cung cấp các đầu ra khác biệt nhỏ hơn khi xem xét các xác nhận

preg_match('/^https:\/\/example\.com\/path/i', $uri);
9

Ngoài ra, các nhận xét có thể được thêm vào bên trong biểu thức chính quy

Có cờ biểu thức chính quy,

var_dump($matches);
6, làm cho công cụ bỏ qua tất cả các ký tự khoảng trắng, cho phép biểu thức được trải ra, căn chỉnh hoặc thậm chí chia thành nhiều dòng

- /^https:\/\/example\.com\/path/i
+ #^https://example\.com/path#i
0

Trong

var_dump($matches);
7, công cụ khớp với ký tự khoảng trắng ngay sau chuỗi
var_dump($matches);
8, nhưng với cờ
var_dump($matches);
6, tất cả khoảng trắng đều bị bỏ qua. Để khớp với khoảng trắng, hãy sử dụng ký tự đặc biệt
preg_match('/^https:\/\/example\.com\/path/i', $uri);
00

Hơn nữa, với cờ

var_dump($matches);
6, ký tự
- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
6 bắt đầu một nhận xét nội tuyến, tương tự như cú pháp nhận xét
preg_match('/^https:\/\/example\.com\/path/i', $uri);
03 và
- preg_match('/^https:\/\/example\.com\/path/i', $uri);
+ preg_match('#^https://example\.com/path#i', $uri);
6 trong PHP

Với nhiều khoảng cách hơn xung quanh các nhóm mẫu phụ hợp lý, mẫu có thể dễ đọc hơn. Tuy nhiên, cách tiếp cận tốt hơn là chia biểu thức thành nhiều dòng và thêm nhận xét

- /^https:\/\/example\.com\/path/i
+ #^https://example\.com/path#i
1

Khi lưu trữ trong một biến PHP, sử dụng Heredoc/Nowdoc có thể giữ nguyên định dạng. Kể từ PHP 7. 3, cú pháp heredoc/nowdoc cũng thoải mái hơn

- /^https:\/\/example\.com\/path/i
+ #^https://example\.com/path#i
2

Biểu thức chính quy hỗ trợ các lớp ký tự và chúng có thể giúp loại bỏ sự xem xét kỹ lưỡng khỏi biểu thức chính quy đồng thời làm cho chúng dễ đọc hơn

preg_match('/^https:\/\/example\.com\/path/i', $uri);
05 có lẽ là lớp nhân vật được sử dụng thường xuyên nhất.
preg_match('/^https:\/\/example\.com\/path/i', $uri);
05 đại diện cho một chữ số và tương đương với
preg_match('/^https:\/\/example\.com\/path/i', $uri);
07 (ở chế độ không phải Unicode). Hơn nữa,
preg_match('/^https:\/\/example\.com\/path/i', $uri);
08 là nghịch đảo của
preg_match('/^https:\/\/example\.com\/path/i', $uri);
05 và tương đương với
preg_match('/^https:\/\/example\.com\/path/i', $uri);
10

Biểu thức chính quy tìm kiếm tỉ mỉ các chữ số, theo sau là một chữ số không có thể được đơn giản hóa mà không thay đổi chức năng

- /^https:\/\/example\.com\/path/i
+ #^https://example\.com/path#i
3

Biểu thức chính quy hỗ trợ một số , điều đó có thể làm cho sự khác biệt nổi bật hơn

  • preg_match('/^https:\/\/example\.com\/path/i', $uri);
    11 tương đương với
    preg_match('/^https:\/\/example\.com\/path/i', $uri);
    12.
    - /^https:\/\/example\.com\/path/i
    + #^https://example\.com/path#i
    4
  • preg_match('/^https:\/\/example\.com\/path/i', $uri);
    13 là một lớp ký tự được đặt tên phù hợp với tất cả các ký tự thập lục phân và tương đương với
    preg_match('/^https:\/\/example\.com\/path/i', $uri);
    14

    - /^https:\/\/example\.com\/path/i
    + #^https://example\.com/path#i
    5
  • preg_match('/^https:\/\/example\.com\/path/i', $uri);
    00 là a khớp với tất cả các ký tự khoảng trắng và tương đương với
    preg_match('/^https:\/\/example\.com\/path/i', $uri);
    16

    - /^https:\/\/example\.com\/path/i
    + #^https://example\.com/path#i
    6

Khi sử dụng các biểu thức chính quy có hỗ trợ Unicode (cờ ____17_______17), nó cho phép thêm một số lớp ký tự. Các lớp ký tự được đặt tên theo mã Unicode có mẫu

preg_match('/^https:\/\/example\.com\/path/i', $uri);
18, trong đó
preg_match('/^https:\/\/example\.com\/path/i', $uri);
19 là tên của lớp ký tự. Sử dụng chữ hoa
preg_match('/^https:\/\/example\.com\/path/i', $uri);
20 (e. g.
preg_match('/^https:\/\/example\.com\/path/i', $uri);
21) là nghịch đảo của lớp ký tự đó

Ví dụ:

preg_match('/^https:\/\/example\.com\/path/i', $uri);
22 là một lớp ký tự được đặt tên cho tất cả các Ký hiệu tiền tệ hiện tại và tương lai. Có một dạng chủ đề dài hơn. g.
preg_match('/^https:\/\/example\.com\/path/i', $uri);
23) nhưng hiện tại PHP không hỗ trợ chúng

- /^https:\/\/example\.com\/path/i
+ #^https://example\.com/path#i
7

Các lớp ký tự cho phép bắt/khớp các lớp ngay cả khi không có kiến ​​thức trước về các ký tự. Các ký hiệu tiền tệ mới được giới thiệu trong tương lai sẽ bắt đầu khớp, ngay khi thông tin đó được đưa vào bản cập nhật cơ sở dữ liệu Unicode tiếp theo

Các lớp ký tự Unicode cũng bao gồm một danh sách các lớp tập lệnh rất hữu ích cho tất cả các tập lệnh Unicode. Chẳng hạn,

preg_match('/^https:\/\/example\.com\/path/i', $uri);
24 đại diện cho tất cả các ký tự từ ngôn ngữ Sinhalese và tương đương với
preg_match('/^https:\/\/example\.com\/path/i', $uri);
25

- /^https:\/\/example\.com\/path/i
+ #^https://example\.com/path#i
8

Một phiên bản trước của bài viết này đã nhầm lẫn trong phần các lớp ký tự được đặt tên và có một ví dụ về các lớp ký tự Unicode dạng dài mà PHP không hỗ trợ. Điều này hiện đã được khắc phục, nhờ Bruno Verley (@brnvrl). Cảm ơn Sergey Lebedev và Taoshu, bài viết này cũng có sẵn bằng tiếng Nga và tiếng Trung

PHP có hỗ trợ regex không?

Trong PHP, biểu thức chính quy là các chuỗi bao gồm dấu phân cách, mẫu và từ bổ nghĩa tùy chọn . $exp = "/w3schools/i"; .

Regex trong PHP là gì?

Biểu thức chính quy thường được gọi là regex. Đây không gì khác hơn là một mẫu hoặc một chuỗi ký tự, mô tả một mẫu tìm kiếm đặc biệt dưới dạng chuỗi văn bản. Cụm từ thông dụng cho phép bạn tìm kiếm một chuỗi cụ thể bên trong một chuỗi khác

'$' nghĩa là gì trong regex?

$ có nghĩa là " Khớp với phần cuối của chuỗi " (vị trí sau ký tự cuối cùng trong chuỗi). Cả hai đều được gọi là neo và đảm bảo rằng toàn bộ chuỗi được khớp thay vì chỉ một chuỗi con.

Làm cách nào để kiểm tra Preg_match trong PHP?

PHP. hàm preg_match() . Thông thường tìm kiếm bắt đầu từ đầu chuỗi chủ đề. Tham số tùy chọn offset được sử dụng để xác định vị trí bắt đầu tìm kiếm từ đâu. This function searches string for pattern, returns true if pattern exists, otherwise returns false. Usually search starts from beginning of subject string. The optional parameter offset is used to specify the position from where to start the search.