(PHP) команда Parse - PullRequest
       3

(PHP) команда Parse

3 голосов
/ 12 августа 2011

Я хочу получить значения тегов команд (GET, FROM, IN и т. Д.). Моя команда:

// 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]);

Выход:

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

Я ищу этот вывод:

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

Как видите, проблема в пробелах и повторяющихся тегах команд в строках (например, from). Так как я могу разобрать эту команду?

Ответы [ 5 ]

8 голосов
/ 12 августа 2011

Вы не можете легко разобрать это с помощью одного регулярного выражения.(Это выполнимо, но не просто.)

Вы должны использовать простой токенизатор, где регулярное выражение снова становится полезным инструментом:

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

Это дает вам простой список, где вы простонужно найти пункты, которые вас интересуют, а затем снова включить последующие токены (хотя я запутался в вашем случае использования):

[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
    )
3 голосов
/ 12 августа 2011
if( preg_match_all('/(GET|FROM|IN)(.(?!(GET|FROM|IN)))+\s*/si',$_cmd, $m))

это означает - найти любой символ после ключевого слова, за которым не следует GET, FROM или IN с пробелом после него

1 голос
/ 12 августа 2011
$_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
1 голос
/ 12 августа 2011

Вы можете удалить регистронезависимый i после разделителя /.А также убедитесь, что после ключевых слов есть хотя бы один пробел.

1 голос
/ 12 августа 2011

Для этого вам нужно разработать язык сценариев.Регулярные выражения не подходят для этих целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...