2012-06-28 33 views
7

Đây là một vấn đề thực sự đơn giản, nhưng tôi không thể tìm thấy giải pháp ở bất kỳ đâu.PHP/REGEX: Nhận một chuỗi trong ngoặc đơn

Tôi đang cố gắng sử dụng preg_match hoặc preg_match_all để lấy chuỗi từ bên trong dấu ngoặc đơn, nhưng không có dấu ngoặc đơn.

Cho đến nay, biểu hiện của tôi trông như thế này:

\([A-Za-z0-9 ]+\) 

và trả về kết quả sau:

3 (nổi bật rỗng) 928-129 (< - chuỗi gốc)

(làm nổi bật rỗng) (< - kết quả)

Những gì tôi muốn là chuỗi trong ngoặc đơn, nhưng không có dấu ngoặc đơn. Nó sẽ giống như thế này:

nổi bật rỗng

tôi có lẽ có thể thay thế các dấu ngoặc đơn sau đó với str_replace hoặc một cái gì đó, nhưng điều đó dường như không phải là một giải pháp rất thanh lịch với tôi.

Tôi phải thêm gì, vì vậy các dấu ngoặc đơn không được bao gồm trong kết quả?

Cảm ơn sự giúp đỡ của bạn, các bạn rất tuyệt! :)

+0

Những gì bạn đang gọi điện thoại ngoặc là thực sự ngoặc. – JohnK

+2

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

12

Bạn chỉ cần thêm chụp ngoặc, ngoài ngoặc thoát của bạn.

<?php 
    $in = "hello (world), my name (is andrew) and my number is (845) 235-0184"; 
    preg_match_all('/\(([A-Za-z0-9 ]+?)\)/', $in, $out); 
    print_r($out[1]); 
?> 

đầu ra này:

Array ([0] => world [1] => is andrew [2] => 845) 
+0

Cảm ơn câu trả lời của bạn. Điều này làm việc tuyệt vời (bên cạnh các dấu gạch chéo ngược thoát). Nhưng làm thế nào để dấu ngoặc giúp? Tôi nghĩ rằng biểu hiện của tôi đã được đọc như thế này: "một khung mở theo sau bởi số lượng ký tự bao gồm các chữ cái, số và khoảng trắng, theo sau là một khung kín". Làm cách nào để các dấu ngoặc đơn (không thoát) được đưa vào đây? Cảm ơn sự giúp đỡ của bạn! :) – Macks

+1

Rất tiếc, xin lỗi về các dấu gạch chéo ngược đã thoát; cố định ngay bây giờ. Dấu ngoặc không thoát có ý nghĩa đặc biệt: bắt giữ. Xem, theo mặc định, toàn bộ kết quả được ghi vào '' [0] '', đó là lý do tại sao '' $ out [0] '' chứa tất cả mọi thứ, ngay cả các dấu ngoặc bạn không muốn. Mỗi ''() '' nắm bắt, tốt, _captures_ bất cứ điều gì ở giữa chúng, và lưu trữ chúng trong các chỉ mục mảng tuần tự, nghĩa là '' [1] '', '' [2] '', '' [3] '', v.v.Ví dụ, nếu chuỗi của bạn là "abc123def456" và regex của bạn là ''/abc (\ d +) (\ w +) (\ d) (\ d +)/'', ảnh chụp của bạn sẽ giống như sau: '' [1] '' = "123", '' [2] '' = "def", '' [3] '' = "4" và '' [4] '' = "56". –

+0

Sự khác biệt giữa '' preg_match'' và '' preg_match_all'' là cái sau sẽ, như tên cho thấy, khớp với tất cả, để có một mảng trong mảng: '' [1] = {"world" , "is andrew", "845"} ''. –

22

thử:

preg_match('/\((.*?)\)/', $s, $a); 

đầu ra:

Array 
(
    [0] => (hollow highlight) 
    [1] => hollow highlight 
) 
+0

Cảm ơn bạn đã Cứu giúp! :) – Macks

+0

cảm ơn điều này đã làm việc cho tôi – itsandy

+0

Bạn thực sự đã cứu ngày của tôi :) – Hossein

Các vấn đề liên quan