如何在PHP中使用正则表达式在SQL查询中提取SELECT和FROM之间的任何字符串?
如何使用regex preg_match或preg_replace提取以下字符串: 从1与id匹配的表中选择id如何在PHP中使用正则表达式在SQL查询中提取SELECT和FROM之间的任何字符串?,php,sql,regex,Php,Sql,Regex,如何使用regex preg_match或preg_replace提取以下字符串: 从1与id匹配的表中选择id 选择名称,从表2中选择价格,其中id='1'变量,从表1中选择价格,其中1将匹配名称,从表2中选择价格,其中id='1'变量如果您的目标是对查询执行一些高级操作,最好的方法是使用sql解析器php sql解析器,例如,如建议的那样。要仅获取SELECT和FROM之间的内容,可以使用以下选项: $test_queries = array( 'SELECT id FROM tab
选择名称,从表2中选择价格,其中id='1'变量,从表1中选择价格,其中1将匹配名称,从表2中选择价格,其中id='1'变量如果您的目标是对查询执行一些高级操作,最好的方法是使用sql解析器php sql解析器,例如,如建议的那样。要仅获取SELECT和FROM之间的内容,可以使用以下选项:
$test_queries = array(
'SELECT id FROM table WHERE 1',
'SELECT name, (SELECT price, (SELECT 1+1) FROM table2) var FROM table1',
'SELeCT FROMAGE, \'\\\'((\', \'"\")(\', "\'\"\\\" FrOM table');
$pattern = <<<'LOD'
~
# definitions
(?(DEFINE)
# content inside quotes
(?<quoted> (["']) (?> [^"'\\]++ | \\{2} | \\. | (?!\g{-1})["'] )*+ \g{-1} )
# nested parenthesis
(?<nested> ( \( (?> [^()"']++ | \g<quoted> | (?-1) )*+ \) ) )
# content between SELECT and FROM
(?<content> (?> [^(F"']++ | \BF | F(?!ROM\b) | \g<quoted> | \g<nested> )++ )
)
# pattern
\bSELECT\b (?<result> \g<content> ) FROM\b
~xis
LOD;
foreach ($test_queries as $k => $test_query) {
if (preg_match($pattern, $test_query, $match))
echo '<br/>' . $k . ') ' . trim($match['result']);
}
我可以很容易地处理第一种情况,但是在看起来像第二种情况的情况下,它会得到name,选择price而不是name,从表2中选择price,其中id='1'变量,因为SELECT子句规则表达式中的FROM不是解决此问题的合适工具。试试看。还有,复制的