2016-04-21 6 views
1

Derzeit versuche ich alle Funktionsparameter mit Regex für Templating zu bekommen. Die Funktionsparameter werden ähnlich wie PHP kompilierbar sein.Regex Fangfunktion Parameter in PHP

hier So ist der Beispieltext analysiert werden benötigt:

"test", 'test2', $test3, ?"%A %d %B %Y", "foo,bar,foobar" 

Dies zu analysiert werden benötigt:

[ 
    '"test"', 
    '\'test2\'', 
    '$test3', 
    '?"%A %d %B %Y"', 
    '"foo,bar,foobar"' 
] 

ich dieses Muster fand aber. Wenn es Kommas (,) zwischen doppelten Anführungszeichen gibt, teilt es sie auch auf.

'~([^,]+\(.+?\))|([^,]+)~x' 

Das Ergebnis dieses Musters ist:

[ 
    '"test"', 
    ' \'test2\'', 
    ' $test3', 
    ' ?"%A %d %B %Y"', 
    ' "foo,', 
    'bar,', 
    'foobar"' 
] 

ich mit regex Muster nicht sehr gut bin. Ich kann grundlegende Dinge damit erreichen, aber ich konnte keinen Weg finden, dies zu erreichen.

+0

Kann es entgangene Zitate geben? –

+0

In der Quellzeichenfolge? Ja könnte es sein. Es kann etwa so aussehen: ''test', $ test2, 'foo, bar' test ',' bar's foo test ',' – Valour

+0

Warum in der Welt nicht' $ result = explode (',', $ string); ' – AbraCadaver

Antwort

0

Ihre Regex behandelt nicht viele Dinge, und einer davon ist der doppelte Wert nach einem Leerzeichen. Da der Anfang kein optionales Leerzeichenmuster hat, wird die letzte Alternative ausgelöst und bei einem Komma angehalten.

können Sie die folgende regex verwenden:

\s*("[^"\\]*(?:\\.[^\\"]*)*"|'[^'\\]*(?:\\.[^\\']*)*'|[^,]+),? 

Siehe regex demo und greifen Capture-Gruppe 1 Werte. Hier

ist ein IDEONE demo:

$re = '~\s*("[^"\\\\]*(?:\\\\.[^\\\\"]*)*"|\'[^\'\\\\]*(?:\\\\.[^\\\\\']*)*\'|[^,]+),?~'; 
$str = "\"test\", 'test2', \$test3, ?\"%A %d %B %Y\", \"foo,bar,foobar\""; 
preg_match_all($re, $str, $tokens); 
print_r($tokens[1]); 

Muster Erklärung:

  • \s* - null oder mehr Leerzeichen
  • ("[^"\\]*(?:\\.[^\\"]*)*"|'[^'\\]*(?:\\.[^\\']*)*'|[^,]+) - eine der drei Alternativen:
    • "[^"\\]*(?:\\.[^\\"]*)*" - doppelte Anführungszeichen (Unterstützung entkam Sequenzen)
    • | - oder
    • '[^'\\]*(?:\\.[^\\']*)*' - einzelne Strings in Anführungszeichen (Unterstützung entkam Sequenzen)
    • | - oder
    • [^,]+ - 1+ andere Zeichen als ein Komma
  • ,? - ein optionales Komma (? - ein oder null Vorkommen)