2010-08-16 5 views
2

J'ai un texte:Expression régulière pour ignorer une virgule optionnelle

$test = <<<START 
DOTHIS themsp1 
    @theint = 431, 
    @theText = "%dumdum%", 
    @operator = 'ANY', 
    @crossCheck = 'PLUS' 


START; 

Le filtre:

$regEx = '/@(.*)=(.*)[,]*?/'; 
preg_match_all($regEx,$test,$vars,PREG_SET_ORDER); 
print_r($vars); 

La sortie:

Array 
(
    [0] => Array 
     (
      [0] => @theint = 431, 
      [1] => theint 
      [2] => 431, 
     ) 

    [1] => Array 
     (
      [0] => @theText = "%dumdum%", 
      [1] => theText 
      [2] => "%dumdum%", 
     ) 

    [2] => Array 
     (
      [0] => @operator = 'ANY', 
      [1] => operator 
      [2] => 'ANY', 
     ) 

    [3] => Array 
     (
      [0] => @crossCheck = 'PLUS' 
      [1] => crossCheck 
      [2] => 'PLUS' 
     ) 

) 

Je ne veux pas des virgules ou la espace dans la sortie :(.. Le problème est que les virgules sont facultatives;

Répondre

2

Dans votre regex $regEx = '/@(.*)=(.*)[,]*?/'; le 2ème (. *) Est gourmand et correspondra à la virgule, puisque la virgule comme vous l'avez écrit est facultative.

Non testé, cette expression régulière autorisera les espaces optionnels autour du signe égal mais ne les inclura pas dans la capture '/@([^\s=]+)\s*=\s*([^\s,]+)\s*,?/' Il permet également l'espace entre la valeur et la virgule.

+0

Merci .. Cela fonctionne :) – Stewie

2
/@(.*?)\s*=\s*(.*?),?/ 

Ajoutez \s* aux espaces appropriés pour correspondre aux espaces. Utilisez un point d'interrogation pour .*? pour faire correspondre non-avidité. Un match non gourmand correspond à une correspondance aussi courte que possible, donc (.*?),? laissera la virgule sur la droite correspondre à une virgule plutôt que la .* capturant la virgule.

0

Vous devriez être plus précis que la simple utilisation ., par exemple:

/@([a-zA-Z]+)[ \t]*=[ \t]*([0-9]+|"(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*')[ \t]*,?/ 

Ici [a-zA-Z]+ spécifié le nom comme une séquence de caractères alphabétiques. Cela est suivi par le = qui peut être entouré d'espaces ou d'onglets. Et puis la valeur est soit un nombre ([0-9]+, séquence d'un ou plusieurs chiffres) ou une chaîne entre guillemets qui peut contenir des séquences d'échappement ("(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*'), suivi par des espaces optionnels ou des tabulations.

Questions connexes