3 Stimmen

(PHP) Parse-Befehl

Ich möchte Werte von Befehls-Tags (GET, FROM, IN, etc.) abrufen:

// My command
$_cmd = 'GET a, b FROM p IN a and c="I am from Sarajevo" or d>1 ';

// My parser
if(preg_match_all('/(GET|FROM|IN)\s+([^\s]+)/si',$_cmd, $m))
    $cmd = array_combine($m[1], $m[2]);

Ausgabe:

Array
(
  [GET] => a,
  [FROM] => p
  [IN] => a
  [from] => Sarajevo"
)

Ich suche nach dieser Ausgabe:

Array
(
  [GET] => a, b
  [FROM] => p
  [IN] => a and c="I am from Sarajevo" or d>1
)

Wie Sie sehen, liegt das Problem bei Leerräume y wiederholte Befehlstags in Zeichenketten (wie from ). Wie kann ich also diesen Befehl analysieren?

8voto

mario Punkte 141130

Das kann man nicht einfach mit einer einzigen Regex analysieren. (Es ist machbar, aber nicht einfach.)

Sie sollten einen einfachen Tokenizer verwenden, wobei eine Regex wieder ein nützliches Werkzeug ist:

  preg_match_all('/\w+|".*?"|\W/', $_cmd = 'GET a, b FROM p IN a and c="I am from Sarajevo" or d>1 ', $list);

So erhalten Sie eine einfache Liste, in der Sie nur die Klauseln finden müssen, an denen Sie interessiert sind, und dann die nachfolgenden Token wieder zusammenführen (obwohl ich über Ihren Anwendungsfall verwirrt bin):

[0] => Array
    (
        [0] => GET
        [1] => a
        [2] => ,
        [3] => b
        [4] => FROM
        [5] => p
        [6] => IN
        [7] => a
        [8] => and
        [9] => c
        [10] => =
        [11] => "I am from Sarajevo"
        [12] => or
        [13] => d
        [14] => >
        [15] => 1
    )

3voto

SergeS Punkte 11008
if( preg_match_all('/(GET|FROM|IN)(.(?!(GET|FROM|IN)))+\s*/si',$_cmd, $m))

das heißt, ein beliebiges Zeichen nach dem Schlüsselwort zu finden, das nicht von GET, FROM oder IN gefolgt wird, mit einem Leerzeichen dahinter

1voto

Dor Punkte 7096

Sie müssen dafür eine Skriptsprache entwickeln. Regexps sind für diese Zwecke nicht geeignet.

1voto

powtac Punkte 39079

Sie könnten die Groß- und Kleinschreibung entfernen i nach dem Begrenzungszeichen / . Achten Sie außerdem darauf, dass nach den Schlüsselwörtern mindestens ein Leerzeichen steht.

1voto

Luis Siquot Punkte 6373
$_cmd = 'GET a, b FROM p IN a and c="I am from Sarajevo" or d>1 ';
$tpar = preg_split('/\s+(GET|FROM|IN)\s+/i', ' '.$_cmd.' ', -1, PREG_SPLIT_DELIM_CAPTURE);
array_walk($tpar, 'trim');

print_r($tpar);

// gives:
array(
  [0] => GET
  [1] => a, b
  [2] => FROM
  [3] => p
  [4] => IN
  [5] => a and c="I am from Sarajevo" or d>1
)
// the rest is straight forward

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X