2011-07-18 46 views
3

我的PHP代碼:獲取從使preg_split分隔符在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 
) 

以下是可能的輸出?

Array 
(
    [SELECT] => var1 
    [FROM] => var2 
    [GROUP BY] => var3 
    [LIMIT] => var4 
) 

或者有沒有什麼辦法讓分隔符?

+4

你有沒有考慮過使用SQL解析器(你一定會得到錯誤的結果,這個正則表達式黑客!)?結帳:http://code.google.com/p/php-sql-parser/ –

+1

@Bart,你的評論是恕我直言,意見是正確的答案。你應該這樣發佈。 –

+0

@Bart - 這個例子有點不同 - 不像SQL命令那麼複雜。我用它,因爲它對每個人都很熟悉。 – dino

回答

2
$cmd = 'SELECT var1 FROM var2 GROUP BY var3 LIMIT var4'; 

$array = array(); 
if(preg_match_all('/(SELECT|FROM|GROUP BY|LIMIT)\s+([^\s]+)/si', $cmd, $matches)) { 
    $array = array_combine($matches[1], $matches[2]); 
} 

var_dump($array); 

結果:

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

速度,簡單而可愛。這就是答案。我才發現。我不需要複雜的SQL解析器。 – dino

3

你有沒有考慮過使用SQL解析器?用這種正則表達式攻擊你肯定會得到錯誤的結果。

結帳:

  1. http://code.google.com/p/php-sql-parser
  2. http://pear.php.net/package/SQL_Parser
  3. PHP MySQL SQL parser (INSERT and UPDATE)

與選項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
+0

+1不重新發明輪子 –

1

嘗試

$matches = array(); 
preg_match ('~^SELECT (?P<SELECT>.+) FROM (?P<FROM>.+) GROUP BY (?P<GROUPBY>.+) LIMIT (?P<LIMIT>.+)~', $cmd, $matches); 

或者是有什麼辦法讓分隔符?

正則表達式總是開始與他們分隔符(因爲它倒過來:第一個字符定義分隔符)

echo $regEx[0]; 
+0

感謝以爲王;) – dino

1

有點亂......

//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) 
+0

+1是的有點凌亂,但你太近了。你的腳本會給出警告:'警告:strpos()...'。我沒有明白。 – dino

+0

這個警告的全文是什麼?從來沒有見過它! – k102

+0

你可以試試這個命令:'SELECT name,order_id FROM sc_order OF order_products of product OF users GROUP BY order.order_id LIMIT 1' – dino

相關問題