2009-04-09 27 views
6

Tôi có một mảng với một số thông tin. Ví dụ:PHP: cách chỉ nhận các từ giữa dấu ngoặc đơn() và xóa mọi thứ khác

(nhà văn) &

hoặc

với (đối thoại thêm)

Tôi muốn để làm sạch này vì vậy tôi chỉ nhận được văn bản giữa các dấu ngoặc đơn() và xóa mọi thứ khác

kết quả:

nhà văn thêm

hoặc

thoại

+0

Bản sao có thể có của [PHP: Cách tốt nhất để trích xuất văn bản trong ngoặc đơn?] (Https://stackoverflow.com/questions/196520/php-best-way-to-extract-text-within-parenthesis) – EdChum

Trả lời

7
$string = "this (is (a) test) with (two parenthesis) duh"; 

Đối với một chuỗi như thế này bạn có thể sử dụng và sử dụng preg_match_all nổ tung.

$string = "this (is (a) test) with (two parenthesis) duh"; 
$regex = '#\((([^()]+|(?R))*)\)#'; 
if (preg_match_all($regex, $string ,$matches)) { 
    echo implode(' ', $matches[1]); 
} else { 
    //no parenthesis 
    echo $string; 
} 

Hoặc bạn có thể sử dụng preg_replace, nhưng với nhiều dấu ngoặc đơn, bạn sẽ mất khoảng trắng giữa chúng.

$regex = '#[^()]*\((([^()]+|(?R))*)\)[^()]*#'; 
$replacement = '\1'; 
echo preg_replace($regex, $replacement, $string); 

Tôi nhận được rất nhiều trợ giúp từ trang này, Finer points of PHP regular expressions.

+0

Thú vị, tôi không biết rằng PHP hỗ trợ các biểu thức chính quy đệ quy. –

+0

Cũng xác nhận, backreferences và điều kiện. Bạn có thể đọc nó ở đây: http://php.net/manual/en/regexp.reference.php#regexp.reference.back-references – OIS

+0

Url trong câu trả lời này hiện đã chết nhưng từ đoạn mã đó, bạn có thể nói có nhiều điều để học hỏi từ nó. Vì vậy, tôi đã tìm kiếm [một phiên bản đã lưu] (http://web.archive.org/web/20120403035903/http://www.skdevelopment.com/php-regular-expressions.php) từ máy rút tiền chỉ trong trường hợp bất kỳ ai quan tâm đến việc xem những thứ gì khác có ở đó –

12

Cách đơn giản nhất sẽ ở cùng một biểu thức chính quy:

preg_match_all('/\((.*?)\)/', $input, $matches); 

$matches[1], $matches[2], v.v. sẽ chứa mọi thứ nằm giữa dấu ngoặc đơn trong $ đầu vào. Tức là, $matches[1] sẽ có bất kỳ thứ gì nằm giữa tập hợp dấu ngoặc đơn đầu tiên, v.v. (để xử lý các trường hợp có nhiều tập hợp).

+0

" Cách dễ nhất sẽ có biểu thức chính quy: "... không nếu bạn muốn dấu ngoặc đơn cân bằng! Làm thế nào để bạn nghĩ rằng OP muốn xử lý "thử nghiệm này (là (a))"?Regex của bạn phù hợp với đó là "là (a". Ngoài ra, nó nhanh hơn (tôi nghĩ) để làm/[^)] * \)/hơn để làm /.*?/ để có được văn bản giữa dấu ngoặc đơn. –

+1

Nếu anh ta đã xác định rằng có thể có dấu ngoặc đơn lồng nhau tôi sẽ không có gợi ý regex. Nhưng anh ta dường như đang đối phó với đầu vào khá đơn giản tổng thể. Viết một trình phân tích cú pháp khi một regex một dòng sẽ thực hiện công việc tương tự là quá mức cần thiết. –

1
$matches = array(); 
$num_matched = preg_match_all('/\((.*)\)/U', $input, $matches); 
1
function getInbetweenStrings($start, $end, $str){ 
    $matches = array(); 
    $regex = "/$start([a-zA-Z0-9_]*)$end/"; 
    preg_match_all($regex, $str, $matches); 
    return $matches[1]; 
} 

cho examle bạn muốn mảng các chuỗi (phím) giữa {} trong sau dụ, nơi '/' không rơi vào giữa

$str = "C://{ad_custom_attr1}/{upn}/{samaccountname}"; 
$str_arr = getInbetweenStrings('{', '}', $str); 

print_r($str_arr); 
0

Sử dụng trên thay thế

echo preg_replace('/\(([\w]{1,2})\)/',"(s\\1)",'(Gs) Main Hall'); 

kết quả trong

(sGs) Main Hall 
Các vấn đề liên quan