2009-06-19 21 views
17

ho una stringa:php per estrarre una stringa da virgolette

Questo è un testo, "Il tuo Balance sinistra $ 0.10", Fine 0

Come posso estrarre la stringa tra i doppi apici e hanno solo il testo (senza le virgolette):

il tuo equilibrio lasciato $ 0,10

Ho provato preg_match_all() ma senza fortuna.

+0

È possibile trovare ['s ($ str) -> tra ('"', '"')'] (https: // github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php # L412) utile, come trovato in [questa libreria standalone] (https://github.com/delight-im/PHP-Str). – caw

risposta

48

Finché il formato rimane lo stesso si può fare questo usando un'espressione regolare. "([^"]+)" corrisponderà il modello

  • doppio citazione
  • Almeno un non-virgolette doppie
  • doppio citazione

Le parentesi intorno alla [^"]+ significa che tale parte verrà restituito come un gruppo separato.

<?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 simple and sweet – diEcho

-7

Basta usare str_replace e fuggire la citazione:

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

Edit:

Siamo spiacenti, non ha ancora vedere che c'era il testo dopo il 2 ° preventivo. In questo caso, farei semplicemente 2 ricerche, una per la prima citazione e una per la seconda citazione, e poi fare un substr per aggiungere tutto il resto tra i due.

0

L'espressione regolare '"([^\\"]+)"' corrisponderà a qualcosa tra due virgolette.

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

Prova questo:

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

si dovrebbe ottenere tutte le stringhe estratte in $ risultati [1].

+0

+1 Per fornire una soluzione con preg_match_all – demongolem

+1

Questo è infatti l'unico che funziona quando si hanno più valori tra virgolette in una stringa. Come il seguente: (a: 2: {i: 0; s: 3: "149"; i: 1; s: 3: "143";}) + la soluzione più pulita. –

5

A differenza di altre risposte, questo supporta le fughe, ad es. "string with \" quote in it".

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

Per tutti a caccia di un completo parser stringa, provate questo:

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

Uso in 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' 
) 

Questo funziona con stringa singola e doppia citata f ragments.

+3

Funziona ma esiste un modo per escludere le virgolette stesse dalla stringa restituita? – 3zzy

Problemi correlati