2017-07-31 78 views
1

从以下字符串中我可以得到table_name的最有效方法是什么?所有我能想到的是substr()table_name长度可能并不总是蜜蜂一样从sql字符串获取表名

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

您是否想过正则表达式? – Reeno

+1

除非你只想支持非常简单的SQL字符串,否则这比你得到的答案看起来更复杂。 FROM和WHERE之间的确可以有一个以上的表名。 –

+1

一个不寻常的需求,也许有更好的选择 – rtfm

回答

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然后空白结束......我的意思是,你可以打破,如果你尝试过够硬。

// 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的fullstring比赛。

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

您不能使preg_match()比这更快。作为使用\K的奖励,输出阵列也小了50%。

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

@Alex不幸的是,你问了你的问题,并在我离开我的电脑时授予你的绿色标记。希望现在对三种新的教育方法印象深刻,这些方法将比以前提交的内容更胜一筹。如果你想要效率,我已经涵盖了你。 – mickmackusa

+0

事实上,在我的测试中,你的方法都比其他方法稍快。由于我的标准是'效率',你应该得到支票。尽管我很讨厌成为印度人,但在下次获得支票时,我不得不减少草率。 – Alex

5

我想这是你想要什么:

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

然后从$匹配正确的数组元素数组来获取表名。在这种情况下,这将是$matches[1]

2

请试试此代码,请。

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

Demo

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