<?php
/**
* Tokenizes text that looks something like SQL.
*/
function tokenizeSQL( $SQL )
{
$functions = array ( 'concat', 'if' );
$token = '\\(|\\)|[\']|"|\140|[*]|,|<|>|<>|=|[+]';
$terminal = $token.'|;| |\\n';
$result = array();
$string = $SQL;
$string = ltrim($string);
$string = rtrim($string,';').';'; // always ends with a terminal
$string = preg_replace( "/[\n\r]/s", ' ', $string );
while(
preg_match( "/^($token)($terminal)/s", $string, $matches ) ||
preg_match( "/^({$token})./s", $string, $matches ) ||
preg_match( "/^([a-zA-Z0-9_.]+?)($terminal)/s", $string, $matches)
)
{
$t = $matches[1];
if ($t=='\'')
{
// it's a string
$t = tokSingleQuoteString( $string );
array_push($result, $t);
}
else if ($t=="\140")
{
// it's a backtick string (a name)
$t = tokBackQuoteString( $string );
array_push($result, $t);
}
else if ($t=='"')
{
// it's a double quoted string (a name in normal sql)
$t = tokDoubleQuoteString( $string );
array_push($result, $t);
}
else
{
array_push($result, $t);
}
$string = substr( $string, strlen($t) );
$string = ltrim($string);
}
return $result;
}
function tokSingleQuoteString( $string )
{
// matches a single-quoted string in $string
// $string starts with a single quote
preg_match('/^(\'.*?\').*$/s', $string, $matches );
return $matches[1];
}
function tokBackQuoteString( $string )
{
// matches a back-quoted string in $string
// $string starts with a back quote
preg_match('/^([\140].*?[\140]).*$/s', $string, $matches );
return $matches[1];
}
function tokDoubleQuoteString( $string )
{
// matches a back-quoted string in $string
// $string starts with a back quote
preg_match('/^(".*?").*$/s', $string, $matches );
return $matches[1];
}
print "<pre>";
print_r(tokenizeSQL('SELECT name, rew from asdf where id in(select papa from sdfff'));
print "</pre>";
- Output for 4.3.0 - 4.3.11, 4.4.0 - 4.4.9, 5.0.0 - 5.0.5, 5.1.0 - 5.1.6, 5.2.0 - 5.2.17, 5.3.0 - 5.3.29, 5.4.0 - 5.4.45, 5.5.0 - 5.5.38, 5.6.0 - 5.6.28, 7.0.0 - 7.0.20, 7.1.0 - 7.1.25, 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.6
- <pre>Array
(
[0] => SELECT
[1] => name
[2] => ,
[3] => rew
[4] => from
[5] => asdf
[6] => where
[7] => id
[8] => in
[9] => (
[10] => select
[11] => papa
[12] => from
[13] => sdfff
)
</pre>
preferences:
217.48 ms | 406 KiB | 370 Q