Hướng dẫn php preg_match parentheses - dấu ngoặc đơn php preg_match

Tôi đang cố gắng viết một regex để khớp với một chuỗi chứa tối đa 2 số và không chứa các dấu hiệu cụ thể như

$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
2 hoặc
$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
3 chẳng hạn:

my name is jojo -> catch all

my name is jojo i'm 20 years old -> catch all

my name is jojo i'm 20 years old and 6 miles away -> catch all

blablabla 40% my name is jojo -> should only catch "my name is jojo"

Thực tế là tôi không thể quản lý để sử dụng

$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
4 kết hợp với
$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
5 trong biểu thức regex: Bây giờ tôi đang cố gắng làm điều gì đó như thế này nhưng nó không hoạt động ...:

preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);

Cảm ơn rất nhiều về sự trợ giúp của bạn. ạ

Hướng dẫn php preg_match parentheses - dấu ngoặc đơn php preg_match

Ben

8.8647 Huy hiệu vàng42 Huy hiệu bạc78 Huy hiệu đồng7 gold badges42 silver badges78 bronze badges

Hỏi ngày 16 tháng 12 năm 2015 lúc 11:07Dec 16, 2015 at 11:07

9

Bây giờ tôi đang cố gắng làm một cái gì đó như thế này nhưng nó không hoạt động ...:

preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);

Bạn không xa giải pháp. So sánh:

$strings = array("my name is jojo",
                 "my name is jojo i'm 20 years old",
                 "my name is jojo i'm 20 years old and 6 miles away",
                 "blablabla 40% my name is jojo");
foreach ($strings as $string)
{
    preg_match_all("/([^0-9=%\s]\s?){10,}([0-9,.]+[^0-9=%]*){0,2}/", $string, $match);
    print_r($match[0]);
}
  • $text = 'ignore everything except this (text)';
    preg_match('#\((.*?)\)#', $text, $match);
    print $match[1];
    
    6 Điều này phù hợp với ít nhất 10 ký tự không phải là không-nor -____ ____ 67-nor không gian mà mỗi ký tự có thể được theo sau bởi không gian.
  • $text = 'ignore everything except this (text)';
    preg_match('#\((.*?)\)#', $text, $match);
    print $match[1];
    
    8 Điều này phù hợp với tối đa 2 số trong đó mỗi số có thể được theo sau bởi các ký tự được phép khác.

Đã trả lời ngày 3 tháng 11 năm 2017 lúc 15:03Nov 3, 2017 at 15:03

Hướng dẫn php preg_match parentheses - dấu ngoặc đơn php preg_match

ArmaliarmaliArmali

Phim thương hiệu vàng 17K1354 Huy hiệu bạc157 Huy hiệu đồng13 gold badges54 silver badges157 bronze badges

92

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.Learn more.
Learn more.

Cách tốt nhất/hiệu quả nhất để trích xuất văn bản giữa dấu ngoặc đơn là gì? Nói rằng tôi muốn lấy chuỗi "văn bản" từ chuỗi "Bỏ qua mọi thứ ngoại trừ (văn bản) này" theo cách hiệu quả nhất có thể.

Cho đến nay, điều tốt nhất tôi nghĩ ra là:

$fullString = "ignore everything except this (text)";
$start = strpos('(', $fullString);
$end = strlen($fullString) - strpos(')', $fullString);

$shortString = substr($fullString, $start, $end);

Có cách nào tốt hơn để làm điều này? Nói chung, tôi biết sử dụng Regex có xu hướng kém hiệu quả hơn, nhưng trừ khi tôi có thể giảm số lượng các cuộc gọi chức năng, có lẽ đây sẽ là cách tiếp cận tốt nhất? Suy nghĩ?

Hỏi ngày 13 tháng 10 năm 2008 lúc 2:08Oct 13, 2008 at 2:08Oct 13, 2008 at 2:08

1

Tôi chỉ cần làm một regex và vượt qua nó. Trừ khi bạn đang thực hiện đủ các lần lặp lại rằng nó trở thành một vấn đề hiệu suất rất lớn, nó chỉ dễ dàng hơn để viết mã (và hiểu khi bạn nhìn lại nó)

$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];

Đã trả lời ngày 13 tháng 10 năm 2008 lúc 2:16Oct 13, 2008 at 2:16Oct 13, 2008 at 2:16

OwenowenOwenOwen

Huy hiệu vàng 81K2121 gold badges117 silver badges113 bronze badges21 gold badges117 silver badges113 bronze badges

7

Vì vậy, thực tế, mã bạn đã đăng không hoạt động: Các tham số

$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
4 là $ chuỗi, $ start và $ length và các tham số
$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
5 là
$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
6,
$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
7. Sửa đổi một chút:$length, and
$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
5 parameters are
$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
6,
$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
7. Slightly modified:
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
3$length, and
$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
5 parameters are
$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
6,
$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
7. Slightly modified:
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
3

Một số sự tinh tế: Tôi đã sử dụng

$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
8 trong tham số bù để giúp PHP trong khi thực hiện tìm kiếm
$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
9 trên dấu ngoặc đơn thứ hai; Chúng tôi tăng
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
30 một và giảm
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
31 để loại trừ dấu ngoặc đơn khỏi trận đấu.

Ngoài ra, không có kiểm tra lỗi nào trong mã này: bạn sẽ muốn đảm bảo

preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
30 và
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
33 không === Sai trước khi thực hiện
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
34.

Đối với việc sử dụng

preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
35 so với Regex; Hiệu suất khôn ngoan, mã này sẽ đánh bại một biểu thức thông thường. Đó là một chút Wordier mặc dù. Tôi ăn và thở
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
35, vì vậy tôi không bận tâm đến điều này quá nhiều, nhưng người khác có thể thích sự nhỏ gọn của một regex.

Một j

3,85014 Huy hiệu vàng38 Huy hiệu bạc52 Huy hiệu đồng14 gold badges38 silver badges52 bronze badges14 gold badges38 silver badges52 bronze badges

Đã trả lời ngày 13 tháng 10 năm 2008 lúc 2:18Oct 13, 2008 at 2:18Oct 13, 2008 at 2:18

Edward Z. Yangedward Z. YangEdward Z. YangEdward Z. Yang

26K16 Huy hiệu vàng79 Huy hiệu bạc108 Huy hiệu đồng16 gold badges79 silver badges108 bronze badges16 gold badges79 silver badges108 bronze badges

1

Sử dụng một biểu thức thông thường:

preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
3

Đã trả lời ngày 13 tháng 10 năm 2008 lúc 3:34Oct 13, 2008 at 3:34Oct 13, 2008 at 3:34

RobrobRobRob

47.6K5 Huy hiệu vàng72 Huy hiệu bạc91 Huy hiệu Đồng5 gold badges72 silver badges91 bronze badges5 gold badges72 silver badges91 bronze badges

Tôi nghĩ rằng đây là cách nhanh nhất để có được các từ giữa dấu ngoặc đơn đầu tiên trong một chuỗi.

preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
4

Đã trả lời ngày 10 tháng 4 năm 2020 lúc 4:34Apr 10, 2020 at 4:34Apr 10, 2020 at 4:34

rüff0rüff0rüff0rüff0

8251 Huy hiệu vàng12 Huy hiệu bạc26 Huy hiệu đồng1 gold badge12 silver badges26 bronze badges1 gold badge12 silver badges26 bronze badges

Các giải pháp Regex đã được đăng -

preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
37 và
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
38 - không trả lại các chuỗi trong cùng giữa một dấu ngoặc mở và đóng. Nếu một chuỗi là
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
39, cả hai đều trả về toàn bộ
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
30, chứ không phải
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
31.

Mẫu phù hợp với các chất nền (sử dụng với

preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
32 để tìm nạp đầu tiên và
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
33 để tìm nạp tất cả các lần xuất hiện) trong dấu ngoặc đơn mà không có dấu ngoặc đơn mở và đóng khác ở giữa IS, nếu trận đấu sẽ bao gồm dấu ngoặc đơn:
$strings = array("my name is jojo",
                 "my name is jojo i'm 20 years old",
                 "my name is jojo i'm 20 years old and 6 miles away",
                 "blablabla 40% my name is jojo");
foreach ($strings as $string)
{
    preg_match_all("/([^0-9=%\s]\s?){10,}([0-9,.]+[^0-9=%]*){0,2}/", $string, $match);
    print_r($match[0]);
}
2

Hoặc, bạn muốn nhận được các giá trị mà không có dấu ngoặc đơn:

$strings = array("my name is jojo",
                 "my name is jojo i'm 20 years old",
                 "my name is jojo i'm 20 years old and 6 miles away",
                 "blablabla 40% my name is jojo");
foreach ($strings as $string)
{
    preg_match_all("/([^0-9=%\s]\s?){10,}([0-9,.]+[^0-9=%]*){0,2}/", $string, $match);
    print_r($match[0]);
}
3

Thay thế

preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
34 bằng
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
35 nếu phải có ít nhất 1 char giữa
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
36 và
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
37.

Details:::

  • preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
    
    38 - Một khung vòng mở (phải được thoát ra để biểu thị một dấu ngoặc đơn theo nghĩa đen vì nó được sử dụng bên ngoài một lớp nhân vật)
  • preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
    
    39 - 0 hoặc nhiều ký tự khác ngoài
    preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
    
    36 và
    preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
    
    37 (lưu ý những
    preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
    
    36 và
    preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
    
    37 không phải thoát ra trong một lớp ký tự như bên trong nó,
    preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
    
    36 và
    preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
    
    37 không thể được sử dụng để chỉ định một nhóm và được coi là parenthes theo nghĩa đen)
  • preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
    
    46 - Một khung tròn đóng (phải được thoát ra để biểu thị một dấu ngoặc đơn theo nghĩa đen vì nó được sử dụng bên ngoài một lớp ký tự).

Phần

preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
47 trong Regex thay thế khớp với
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
36 và bỏ qua giá trị khớp (với toán tử thiết lập lại đối sánh
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
49).
$strings = array("my name is jojo",
                 "my name is jojo i'm 20 years old",
                 "my name is jojo i'm 20 years old and 6 miles away",
                 "blablabla 40% my name is jojo");
foreach ($strings as $string)
{
    preg_match_all("/([^0-9=%\s]\s?){10,}([0-9,.]+[^0-9=%]*){0,2}/", $string, $match);
    print_r($match[0]);
}
20 là một cái nhìn tích cực đòi hỏi
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
36 phải xuất hiện ngay lập tức ở bên trái của vị trí hiện tại, nhưng
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
36 không được thêm vào giá trị khớp vì các mẫu tìm kiếm (tìm kiếm) không tiêu thụ.
$strings = array("my name is jojo",
                 "my name is jojo i'm 20 years old",
                 "my name is jojo i'm 20 years old and 6 miles away",
                 "blablabla 40% my name is jojo");
foreach ($strings as $string)
{
    preg_match_all("/([^0-9=%\s]\s?){10,}([0-9,.]+[^0-9=%]*){0,2}/", $string, $match);
    print_r($match[0]);
}
23 là một cái nhìn tích cực đòi hỏi một char
preg_match_all("/(([^0-9=%]|\r\n|\s){10,}[0-9,.]*){2}/",$string,$match);
37 phải xuất hiện ngay lập tức ở bên phải vị trí hiện tại.

Mã PHP:

$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
5

Output:

$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
6

Đã trả lời ngày 13 tháng 5 năm 2019 lúc 14:08May 13, 2019 at 14:08May 13, 2019 at 14:08

Wiktor Stribiżewwiktor StribiżewWiktor StribiżewWiktor Stribiżew

581K34 Huy hiệu vàng400 Huy hiệu bạc503 Huy hiệu Đồng34 gold badges400 silver badges503 bronze badges34 gold badges400 silver badges503 bronze badges

Đây là mã mẫu để trích xuất tất cả văn bản giữa '[' và ']' và lưu trữ 2 mảng riêng biệt (tức là văn bản bên trong dấu ngoặc đơn trong một mảng và văn bản bên ngoài dấu ngoặc đơn trong một mảng khác)

$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
7

Đầu ra: Trích xuất_Text ("Xin chào bạn thế nào?"); sẽ sản xuất:

$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
0

Trích xuất_Text ("Xin chào [http://www.google.com/test.mp3] Bạn có khỏe không?"); sẽ sản xuất

$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
1

Đã trả lời ngày 29 tháng 1 năm 2014 lúc 8:22Jan 29, 2014 at 8:22Jan 29, 2014 at 8:22

1

Hàm này có thể hữu ích.

$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
2

strpos () => được sử dụng để tìm vị trí của lần xuất hiện đầu tiên trong một chuỗi.

strrpos () => được sử dụng để tìm vị trí của lần xuất hiện đầu tiên trong một chuỗi.

Đã trả lời ngày 2 tháng 5 năm 2017 lúc 3:46May 2, 2017 at 3:46May 2, 2017 at 3:46

Vijayvijayvijayvijay

3192 Huy hiệu bạc8 Huy hiệu đồng2 silver badges8 bronze badges2 silver badges8 bronze badges

$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];
3

Đây là một chút cải thiện cho câu trả lời trước đó sẽ trả về tất cả các mẫu ở dạng mảng:

GetStringsbeted giữa ('[t] [] là [test] chuỗi [mẫu]') sẽ trả về:

Đã trả lời ngày 8 tháng 4 năm 2019 lúc 8:21Apr 8, 2019 at 8:21Apr 8, 2019 at 8:21