从sql字符串中获取表名

时间:2017-07-31 21:07:50

标签: php regex string

从以下字符串中获取table_name的最有效方法是什么?我能想到的只是substr(),但table_name的长度可能并不总是相同

SELECT * FROM `table_name` WHERE `id` = '1'

4 个答案:

答案 0 :(得分:5)

我认为这就是你想要的:

<?php
$query = "SELECT * FROM `table_name` WHERE `id` = '1'";
$pattern = "/SELECT \* FROM `(.*?)`/";
preg_match($pattern, $query, $matches);
print_r($matches);
?>

然后从$ matches数组中选择正确的数组元素以获取表名。在这种情况下,$matches[1]

答案 1 :(得分:2)

请尝试使用此代码。

<?php
$query = "SELECT * FROM `table_name` WHERE `id` = '1'";
$pattern = "/SELECT \* FROM `(.*?)`/";
preg_match($pattern, $query, $matches);
echo $matches[1];
?>

Demo

答案 2 :(得分:2)

您可以使用preg_match() -

执行以下操作
<?php

$string = "SELECT * FROM `table_name` WHERE `id` = '1'";

preg_match("/FROM (.*?) WHERE/",$string,$matches);

print_r($matches); // now you can do echo $matches[1];

输出: - https://eval.in/839906https://eval.in/839907

答案 3 :(得分:1)

如果你想要最有效率,那么不要使用正则表达式 - 它比非正则表达式方法慢得多。我所遵循的三种方法都将胜过本页面上的其他答案。其他模式未针对速度进行优化(它们使用捕获组,不使用否定字符类)。

我订购了以下三种方法,从最快到最慢。这是demo of all three methods

这是所有方法的输入:

$sql="SELECT * FROM `table_name` WHERE `id` = '1'";

所有方法都会在没有反引号的情况下输出table_name

方法#1 - explode()是最快的,但只有在表名的前导反引号之前没有反引号时才会起作用。

// explode(): *only works if no backticks before FROM clause*
echo explode('`',$sql,3)[1];  // limit elements to maximum of 3, we only want the 2nd

方法#2 - strpos()substr()将是第二快的,并提供100%的可靠性,因为它正在找到FROM后面的反引号(假设你没有一些以FROM结尾的zany列名,然后是一个空格&amp;你用反引号包装它......我的意思是,如果你努力的话,可以打破它。

// pure string functions:
$tick1=strpos($sql,'FROM `')+6;
$tick2=strpos($sql,'`',$tick1);
echo substr($sql,$tick1,$tick2-$tick1);

方法#3 - preg_match()是我的三种方法中最慢的,但仍然比所有其他答案更有效。 Pattern Demo(9个步骤)仅供参考:Kamrans'= 40步,Alive = 39步,Cagy = 40。

为什么我这么快?

  • 我没有使用括号来捕获匹配项,我使用\K重新启动全字符串匹配。

  • 我还使用了一个否定的字符类[^] +`来匹配第一个反引号之后的一个或多个非反引号字符。

你不能让preg_match()比这更快。作为使用\K的好处,输出数组也会减少50%。

// Will work regardless of backticks in SELECT clause:
echo preg_match('/FROM `\K[^`]+/',$sql,$out)?$out[0]:'failed';