Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中使用正则表达式在SQL查询中提取SELECT和FROM之间的任何字符串?_Php_Sql_Regex - Fatal编程技术网

如何在PHP中使用正则表达式在SQL查询中提取SELECT和FROM之间的任何字符串?

如何在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

如何使用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 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不是解决此问题的合适工具。试试看。还有,复制的