Hướng dẫn php extract text between parentheses - php trích xuất văn bản giữa các dấu ngoặc đơn

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.

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: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:16

OwenowenOwen

Huy hiệu vàng 81K2121 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:

$str = "ignore everything except this [text]";
$start  = strpos[$str, '['];
$end    = strpos[$str, ']', $start + 1];
$length = $end - $start;
$result = substr[$str, $start + 1, $length - 1];

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
$str = "ignore everything except this [text]";
$start  = strpos[$str, '['];
$end    = strpos[$str, ']', $start + 1];
$length = $end - $start;
$result = substr[$str, $start + 1, $length - 1];
0 một và giảm
$str = "ignore everything except this [text]";
$start  = strpos[$str, '['];
$end    = strpos[$str, ']', $start + 1];
$length = $end - $start;
$result = substr[$str, $start + 1, $length - 1];
1 để 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

$str = "ignore everything except this [text]";
$start  = strpos[$str, '['];
$end    = strpos[$str, ']', $start + 1];
$length = $end - $start;
$result = substr[$str, $start + 1, $length - 1];
0 và
$str = "ignore everything except this [text]";
$start  = strpos[$str, '['];
$end    = strpos[$str, ']', $start + 1];
$length = $end - $start;
$result = substr[$str, $start + 1, $length - 1];
3 không === Sai trước khi thực hiện
$str = "ignore everything except this [text]";
$start  = strpos[$str, '['];
$end    = strpos[$str, ']', $start + 1];
$length = $end - $start;
$result = substr[$str, $start + 1, $length - 1];
4.

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

$str = "ignore everything except this [text]";
$start  = strpos[$str, '['];
$end    = strpos[$str, ']', $start + 1];
$length = $end - $start;
$result = substr[$str, $start + 1, $length - 1];
5 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ở
$str = "ignore everything except this [text]";
$start  = strpos[$str, '['];
$end    = strpos[$str, ']', $start + 1];
$length = $end - $start;
$result = substr[$str, $start + 1, $length - 1];
5, 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 badges

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

Edward 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 badges

1

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

if[ preg_match[ '!\[[[^\]]+]\]!', $text, $match ] ]
    $text = $match[1];

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

RobrobRob

47.6K5 Huy hiệu vàng72 Huy hiệu bạc91 Huy hiệu Đồng5 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.

$string = 'ignore everything except this [text]';
$string = explode[']', [explode['[', $string][1]]][0];
echo $string;

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

rüff0rüff0rüff0

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

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

$str = "ignore everything except this [text]";
$start  = strpos[$str, '['];
$end    = strpos[$str, ']', $start + 1];
$length = $end - $start;
$result = substr[$str, $start + 1, $length - 1];
7 và
$str = "ignore everything except this [text]";
$start  = strpos[$str, '['];
$end    = strpos[$str, ']', $start + 1];
$length = $end - $start;
$result = substr[$str, $start + 1, $length - 1];
8 - 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à
$str = "ignore everything except this [text]";
$start  = strpos[$str, '['];
$end    = strpos[$str, ']', $start + 1];
$length = $end - $start;
$result = substr[$str, $start + 1, $length - 1];
9, cả hai đều trả về toàn bộ
if[ preg_match[ '!\[[[^\]]+]\]!', $text, $match ] ]
    $text = $match[1];
0, chứ không phải
if[ preg_match[ '!\[[[^\]]+]\]!', $text, $match ] ]
    $text = $match[1];
1.

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

if[ preg_match[ '!\[[[^\]]+]\]!', $text, $match ] ]
    $text = $match[1];
2 để tìm nạp đầu tiên và
if[ preg_match[ '!\[[[^\]]+]\]!', $text, $match ] ]
    $text = $match[1];
3 để 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:

\[[^[]]*\]

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

\[[[^[]]*]\]        // get Group 1 values after a successful call to preg_match_all, see code below
\[\K[^[]]*[?=\]]    // this and the one below get the values without parentheses as whole matches 
[? [text]  [1] => [text here] ]
Array [ [0] => text    [1] => text here   ]

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

Wiktor 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 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]

   function extract_text[$string]
   {
    $text_outside=array[];
    $text_inside=array[];
    $t="";
    for[$i=0;$i đượ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:46

Vijayvijayvijay

3192 Huy hiệu bạc8 Huy hiệu đồng2 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:21

Bài Viết Liên Quan

Chủ Đề