2009-06-19 54 views
17

Tôi có một chuỗi:php để trích xuất một chuỗi từ dấu nháy kép

Đây là một văn bản, "Cân bằng của bạn để lại $ 0.10", End 0

Làm thế nào tôi có thể trích xuất các chuỗi ở giữa các dấu ngoặc kép và chỉ có văn bản (không có dấu ngoặc kép):

Balance bạn rời $ 0,10

Tôi đã thử preg_match_all() nhưng không có may mắn.

+0

Bạn có thể tìm thấy ['s ($ str) -> giữa ('"', '"')'] (https: // github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php # L412) hữu ích, như được tìm thấy trong [thư viện độc lập này] (https://github.com/delight-im/PHP-Str). – caw

Trả lời

48

Miễn là định dạng vẫn giữ nguyên, bạn có thể thực hiện việc này bằng cụm từ thông dụng. "([^"]+)" sẽ phù hợp với mô hình

  • đúp quote
  • Ít nhất một phi đúp quote
  • đúp quote

Các dấu ngoặc xung quanh [^"]+ có nghĩa rằng phần sẽ được trả lại như một nhóm riêng biệt.

<?php 

$str = 'This is a text, "Your Balance left $0.10", End 0'; 

//forward slashes are the start and end delimeters 
//third parameter is the array we want to fill with matches 
if (preg_match('/"([^"]+)"/', $str, $m)) { 
    print $m[1]; 
} else { 
    //preg_match returns the number of matches found, 
    //so if here didn't match pattern 
} 

//output: Your Balance left $0.10 
+0

+1 đơn giản và ngọt ngào – diEcho

-7

Chỉ cần sử dụng str_replace và thoát khỏi quote:

str_replace("\"","",$yourString); 

Edit:

Xin lỗi, didnt thấy rằng đã có văn bản sau khi báo giá 2nd. Trong trường hợp đó, tôi chỉ đơn giản là 2 tìm kiếm, một cho báo giá đầu tiên và một cho báo giá thứ 2, và sau đó làm một chất nền để thêm tất cả các công cụ giữa hai.

0

Cụm từ thông dụng '"([^\\"]+)"' sẽ khớp với bất kỳ thứ gì giữa hai dấu ngoặc kép.

$string = '"Your Balance left $0.10", End 0'; 
preg_match('"([^\\"]+)"', $string, $result); 
echo $result[0]; 
9

Hãy thử điều này:

preg_match_all('`"([^"]*)"`', $string, $results); 

bạn sẽ nhận được tất cả các chuỗi chiết xuất của bạn trong $ kết quả [1].

+0

+1 Để cung cấp giải pháp với preg_match_all – demongolem

+1

Đây là thực tế chỉ có một hoạt động khi bạn có nhiều giá trị giữa dấu ngoặc kép trong một chuỗi. Giống như sau: (a: 2: {i: 0; s: 3: "149"; i: 1; s: 3: "143";}) + giải pháp sạch nhất. –

5

Không giống như các câu trả lời khác, điều này hỗ trợ thoát, ví dụ: "string with \" quote in it".

$content = stripslashes(preg_match('/"((?:[^"]|\\\\.)*)"/')); 
13

Đối với tất cả mọi người săn tìm một phân tích cú pháp chuỗi đầy đủ tính năng, hãy thử này:

(?:(?:"(?:\\"|[^"])+")|(?:'(?:\\'|[^'])+')); 

sử dụng trong preg_match:

$haystack = "something else before 'Lars\' Teststring in quotes' something else after"; 
preg_match("/(?:(?:\"(?:\\\\\"|[^\"])+\")|(?:'(?:\\\'|[^'])+'))/is",$haystack,$match); 

Returns:

Array 
(
    [0] => 'Lars\' Teststring in quotes' 
) 

này làm việc với chuỗi trích dẫn đơn và đôi f ragments.

+3

Hoạt động nhưng có cách nào để loại trừ các dấu ngoặc kép khỏi chuỗi được trả về không? – 3zzy

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