[英]Get table name from sql string
从以下字符串获取table_name
的最有效方法是什么? 我只想到了substr()
但table_name
的长度可能并不总是相同
SELECT * FROM `table_name` WHERE `id` = '1'
我认为这是您想要的:
<?php
$query = "SELECT * FROM `table_name` WHERE `id` = '1'";
$pattern = "/SELECT \* FROM `(.*?)`/";
preg_match($pattern, $query, $matches);
print_r($matches);
?>
然后从$ matches数组中选择正确的数组元素以获取表名。 在这种情况下,将是$matches[1]
请尝试此代码。
<?php
$query = "SELECT * FROM `table_name` WHERE `id` = '1'";
$pattern = "/SELECT \* FROM `(.*?)`/";
preg_match($pattern, $query, $matches);
echo $matches[1];
?>
您可以像下面那样使用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/839906或https://eval.in/839907
如果您想获得最高效率,请不要使用正则表达式-它比非正则表达式方法要慢得多。 接下来的三种方法都将胜过此页面上的其他答案。 其他模式并未针对速度进行优化(它们使用捕获组,并且不使用否定的字符类)。
我已经从最快到最慢命令了以下三种方法。 这是这三种方法的演示 。
这是所有方法的输入:
$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()
是我这三种方法中最慢的一种,但仍比所有其他答案更有效。 模式演示 (9个步骤)仅供参考:Kamrans'= 40个步骤,Alive's = 39个步骤,Cagy's = 40。
为什么我的速度这么快?
我没有使用括号来捕获匹配项,而是使用\\K
重新启动了全字符串匹配项。
我还使用否定字符类[^
] +`来匹配第一个反引号之后的一个或多个非反引号字符。
您不能使preg_match()
更快。 使用\\K
的好处是输出数组也缩小了50%。
// Will work regardless of backticks in SELECT clause:
echo preg_match('/FROM `\K[^`]+/',$sql,$out)?$out[0]:'failed';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.