(PHP)Parse命令

bey*_*ski 3 php arrays parsing

我想得到命令标签的值(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]);
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
  [GET] => a,
  [FROM] => p
  [IN] => a
  [from] => Sarajevo"
)
Run Code Online (Sandbox Code Playgroud)

我正在寻找这个输出:

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

如您所见,问题在于字符串中的空格重复的命令标记(如from).那我怎么解析这个命令呢?

mar*_*rio 8

您无法使用单个正则表达式轻松解析它.(这是可行的,但并不简单.)

您应该使用一个简单的标记化器,其中正则表达式再次成为一个有用的工具:

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

这给你一个简单的列表,你只需找到你感兴趣的子句,然后重新合并后续的令牌(虽然我对你的用例感到困惑):

[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
    )
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`(?!\ s)\ W`代替`\ W`来删除空格.如果要合并生成的部分,则应保留空格.(这就是我再次禁用该选项的原因.) - 真的取决于你是否需要它作为标记器,或者仅仅是为了分解字符串部分. (2认同)
  • 当然; 但那只是更多的工作.(字符串函数和许多PHP代码通常比preg_match慢.) (2认同)