SELECT * FROM {table} WHERE name="123 {qwerty} 789" AND id IN (SELECT id FROM {other_table})
preg_replace('/\{([\w\d_]+)\}/', 'prefix_$1', $query);
function ReplaceTableNames($sql)
{
$prefix = 'prefix_';
$escape = false;
$quot = false;
$table = false;
for ($i = 0; $i < strlen($sql); $i++)
{
switch($sql[$i])
{
case '\\':
if ($quot !== false)
$escape = !$escape;
break;
case '"':
case '\'':
if (!$escape)
{
if ($quot !== false)
{
if ($quot == $sql[$i])
{
$quot = false;
}
}
else
{
$quot = $sql[$i];
$table = false;
}
}
else
{
$escape = false;
}
break;
case '{':
if ($quot === false)
{
$table = '';
}
break;
case '}':
if ($table !== false)
{
$sql = substr_replace($sql, $prefix.$table, $i - strlen($table) - 1, strlen($table) + 2);
$i += strlen($prefix) - 1;
$table = false;
}
break;
default:
if ($table !== false)
{
if (preg_match('|[\w\d_\.]+|i', $sql[$i]))
{
$table .= $sql[$i];
}
else
{
$table = false;
}
}
}
}
return $sql;
}
define( 'STATE_QUOTE_OPEN', 1 );
define( 'STATE_QUOTE_CLOSE', 2 );
define( 'STATE_LQUOTE_OPEN', 3 );
define( 'STATE_LQUOTE_CLOSE', 4 );
define( 'STATE_BRACE_OPEN', 5 );
define( 'STATE_BRACE_CLOSE', 6 );
function parse( $str, $repl ){
$state = 0; // default
$buf = '';
$brace_pos_start = 0;
for( $i = 0; $i < strlen( $str ); $i++ ){
switch( $str[$i] ){
case '"':
$state = $state == STATE_QUOTE_OPEN ? STATE_QUOTE_CLOSE : STATE_QUOTE_OPEN;
break;
case "'":
$state = $state == STATE_LQUOTE_OPEN ? STATE_LQUOTE_CLOSE : STATE_LQUOTE_OPEN;
break;
case '{':
if( $state != STATE_QUOTE_OPEN && $state != STATE_LQUOTE_OPEN ){
$state = STATE_BRACE_OPEN;
$buf = '';
$brace_pos_start = $i;
}
break;
case '}':
if( $state == STATE_BRACE_OPEN ){
$state = STATE_BRACE_CLOSE;
$str = substr_replace( $str, $repl[ $buf ], $brace_pos_start, $i - $brace_pos_start + 1 );
$i = $brace_pos_start + strlen( $repl[ $buf ] );
}
break;
default:
if( $state == STATE_BRACE_OPEN ) $buf .= $str[$i];
break;
}
}
return $str;
}
echo parse( 'SELECT * FROM {table} WHERE name="123 {qwerty} 789" AND id IN (SELECT id FROM {other_table})',
array( 'table' => 'tbl1', 'other_table' => 'tbl2' ) );
/(FROM|UPDATE|ALTER)\s+{([\w\d_]+)\}/iU
а вы приводите ломающий ее пример UPDATE {table} SET `text`="пример запроса: SELECT * FROM {table}"
… При том, что запросы, включающие в себя данные, уже года 4 как нормальные люди не используют. Есть же плейсхолдеры (в похапе их поддерживает как минимум PDO). Т.е. будете писать UPDATE {table} SET `text`=:text WHERE id IN( SELECT id FROM {other_table})
, проводить все ваши замечательные замены и потом уже средствами PDO биндить данные к запросу.SELECT * FROM {#$table$#}
. Ну и крайний случай — пишите полноценный парсер SQL по всяким BNF правилам. Хотя тогда скорее всего просто зря потеряете кучу времени. preg_replace('/\FROM\s+{([\w\d_]+)\}/i', 'FROM {prefix_$1}', $query);