2009-06-19 4 views
17

J'ai une chaîne:php pour extraire une chaîne de guillemet

Ceci est un texte, « Votre équilibre gauche 0,10 $ », Fin 0

Comment puis-je extraire la chaîne entre les guillemets doubles et ont seulement le texte (sans les guillemets):

votre solde gauche 0,10

$

J'ai essayé preg_match_all() mais sans chance.

+0

Vous pourriez trouver ['s ($ str) -> entre ('"', '"')'] (https: // github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php # L412) utile, tel que trouvé dans [cette bibliothèque autonome] (https://github.com/delight-im/PHP-Str). – caw

Répondre

48

Tant que le format reste le même, vous pouvez le faire en utilisant une expression régulière. "([^"]+)" va correspondre au modèle

  • Double-quote
  • Au moins un-devis non double
  • Double-quote

Les crochets autour du [^"]+ signifie que cette partie sera renvoyé dans un groupe séparé.

<?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 et doux – diEcho

-7

utiliser juste str_replace et échapper à la citation:

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

Edit:

Désolé, je ne ai vu qu'il y avait du texte après la 2ème citation. Dans ce cas, je ferais simplement deux recherches, une pour la première citation et une pour la deuxième citation, et ensuite faire une sous-chaîne pour ajouter tout ce qui se trouve entre les deux.

0

L'expression régulière '"([^\\"]+)"' correspond à n'importe quoi entre deux guillemets doubles.

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

Essayez ceci:

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

Vous devriez obtenir toutes vos chaînes extraites dans les résultats de $ [1].

+0

+1 Pour fournir une solution avec preg_match_all – demongolem

+1

Ceci est en fait le seul qui fonctionne lorsque vous avez plusieurs valeurs entre guillemets dans une chaîne. Comme le suivant: (a: 2: {i: 0; s: 3: "149"; i: 1; s: 3: "143";}) + la solution la plus propre. –

5

Contrairement à d'autres réponses, cela prend en charge les échappements, par ex. "string with \" quote in it".

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

Pour tout le monde chasse pour un analyseur de chaîne complet, essayez ceci:

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

Utilisation dans preg_match:

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

Retours:

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

Cela fonctionne avec chaîne de guillemets simple et double f des ragments.

+3

Fonctionne mais existe-t-il un moyen d'exclure les guillemets de la chaîne retournée? – 3zzy

Questions connexes