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

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

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.

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

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

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

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 
(?<=\()[^()]*(?=\)) // less efficient, not recommended

Thay thế

if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
    $text = $match[1];
4 bằng
if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
    $text = $match[1];
5 nếu phải có ít nhất 1 char giữa
if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
    $text = $match[1];
6 và
if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
    $text = $match[1];
7.

Details::

  • if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
        $text = $match[1];
    
    8 - 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)
  • if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
        $text = $match[1];
    
    9 - 0 hoặc nhiều ký tự khác ngoài
    if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
        $text = $match[1];
    
    6 và
    if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
        $text = $match[1];
    
    7 (lưu ý những
    if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
        $text = $match[1];
    
    6 và
    if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
        $text = $match[1];
    
    7 không phải thoát ra trong một lớp ký tự như bên trong nó,
    if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
        $text = $match[1];
    
    6 và
    if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
        $text = $match[1];
    
    7 không thể được sử dụng để chỉ định một nhóm và được coi là parenthes theo nghĩa đen)
  • $string = 'ignore everything except this (text)';
    $string = explode(')', (explode('(', $string)[1]))[0];
    echo $string;
    
    6 - 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

$string = 'ignore everything except this (text)';
$string = explode(')', (explode('(', $string)[1]))[0];
echo $string;
7 trong Regex thay thế khớp với
if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
    $text = $match[1];
6 và bỏ qua giá trị khớp (với toán tử thiết lập lại đối sánh
$string = 'ignore everything except this (text)';
$string = explode(')', (explode('(', $string)[1]))[0];
echo $string;
9).
\([^()]*\)
0 là một cái nhìn tích cực đòi hỏi
if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
    $text = $match[1];
6 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
if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
    $text = $match[1];
6 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ụ.
\([^()]*\)
3 là một cái nhìn tích cực đòi hỏi một char
if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
    $text = $match[1];
7 phải xuất hiện ngay lập tức ở bên phải vị trí hiện tại.

Mã PHP:

$fullString = 'ignore everything except this (text) and (that (text here))';
if (preg_match_all('~\(([^()]*)\)~', $fullString, $matches)) {
    print_r($matches[0]); // Get whole match values
    print_r($matches[1]); // Get Group 1 values
}

Output:

Array ( [0] => (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

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

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

Đầ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: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:46

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

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