从以下字符串中获取table_name
的最有效方法是什么?我能想到的只是substr()
,但table_name
的长度可能并不总是相同
SELECT * FROM `table_name` WHERE `id` = '1'
答案 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];
?>
答案 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];
答案 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';