从PHP中的preg_split获取分隔符

从PHP中的preg_split获取分隔符,php,regex,Php,Regex,我的PHP代码: $cmd = 'SELECT var1 FROM var2 GROUP BY var3 LIMIT var4'; // split command $p = preg_split('/SELECT|FROM|GROUP BY|LIMIT/si', $cmd); 输出: Array ( [0] => [1] => var1 [2] => var2 [3] => var3 [4] => var4 ) 输出是否可能

我的PHP代码:

$cmd = 'SELECT var1 FROM var2 GROUP BY var3 LIMIT var4';
// split command
$p = preg_split('/SELECT|FROM|GROUP BY|LIMIT/si', $cmd);
输出:

Array
(
  [0] =>  
  [1] =>  var1 
  [2] =>  var2 
  [3] =>  var3
  [4] =>  var4
)
输出是否可能低于


或者有没有办法获取分隔符?

您考虑过使用SQL解析器吗?你一定会用这个正则表达式得到错误的结果

结帐:

带有选项1的演示:

#!/usr/bin/env php
<?php

// http://php-sql-parser.googlecode.com/svn/trunk/php-sql-parser.php
require_once('php-sql-parser.php');

$cmd = 'SELECT var1 FROM var2 GROUP BY var3 LIMIT var4';
$parser = new PHPSQLParser($cmd);
$parse_tree = $parser->parsed;

echo 'SELECT -> ' . $parse_tree['SELECT'][0]['base_expr'] . "\n";
echo 'FROM   -> ' . $parse_tree['FROM'][0]['table'] . "\n";
echo 'GROUP  -> ' . $parse_tree['GROUP'][0]['base_expr'] . "\n";
echo 'LIMIT  -> ' . $parse_tree['LIMIT']['end'] . "\n";

?>
产生:

SELECT -> var1 FROM -> var2 GROUP -> var3 LIMIT -> var4 结果:

array
  'SELECT' => string 'var1' (length=4)
  'FROM' => string 'var2' (length=4)
  'GROUP BY' => string 'var3' (length=4)
  'LIMIT' => string 'var4' (length=4)
试一试

有点乱

//echo file_get_contents('http://wp.me/pbZy8-1WM');
$cmd = 'SELECT var1 FROM var2 GROUP BY var3 LIMIT var4';
// split command
$pattern = 'SELECT|FROM|GROUP BY|LIMIT';
$p = preg_split('/('.$pattern.')/si', $cmd, null,PREG_SPLIT_DELIM_CAPTURE);
foreach($p as $i => $str)
if (strpos($pattern,$str) !== false)
{
    $rez[$str] = $p[$i+1];
} 
var_dump($rez);
给出:

  'SELECT' => string ' var1 ' (length=6)
  'FROM' => string ' var2 ' (length=6)
  'GROUP BY' => string ' var3 ' (length=6)
  'LIMIT' => string ' var4' (length=5)

你有没有考虑过使用SQL解析器,你一定会在这个正则表达式破解中得到错误的结果!?结帐:@Bart,你的评论是正确的。您应该这样发布它。@Bart-这个例子有点不同-不像SQL命令那么复杂。我使用它,因为它对每个人来说都很熟悉。@dine:使用解析器并不是那么困难,从长远来看,它肯定会给你带来更少的麻烦。结帐,这真的很简单。@Bart-是的,我认为你是对的;谢谢…+1是的,有点凌乱,但你离得太近了。您的脚本给出了一个警告:warning:strpos。。。。我不明白。这个警告的全文是什么?从来没见过!你能用这个命令试试吗:按订单从用户产品组的订单产品的sc\U订单中选择名称、订单id。订单id限制1'SELECT'=>string'名称,订单id'length=16'来自'=>string'sc.'order OF order\u products OF product OF users'length=48'按'=>string'order.order\u id'length=16'LIMIT'=>string'1'length=2是的,我只是在strpos的开头加了@char。速度快,简单,可爱。这就是答案。我才意识到。我不需要复杂的SQL解析器。
$matches = array();
preg_match ('~^SELECT (?P<SELECT>.+) FROM (?P<FROM>.+) GROUP BY (?P<GROUPBY>.+) LIMIT (?P<LIMIT>.+)~', $cmd, $matches);
echo $regEx[0];
//echo file_get_contents('http://wp.me/pbZy8-1WM');
$cmd = 'SELECT var1 FROM var2 GROUP BY var3 LIMIT var4';
// split command
$pattern = 'SELECT|FROM|GROUP BY|LIMIT';
$p = preg_split('/('.$pattern.')/si', $cmd, null,PREG_SPLIT_DELIM_CAPTURE);
foreach($p as $i => $str)
if (strpos($pattern,$str) !== false)
{
    $rez[$str] = $p[$i+1];
} 
var_dump($rez);
  'SELECT' => string ' var1 ' (length=6)
  'FROM' => string ' var2 ' (length=6)
  'GROUP BY' => string ' var3 ' (length=6)
  'LIMIT' => string ' var4' (length=5)