如果你想要最高效的,那么不要使用正则表达式——它比非正则表达式方法慢得多。我遵循的三种方法都将优于此页面上的其他答案。其他模式没有针对速度进行优化(它们使用捕获组并且不使用否定字符类)。
我已将以下三种方法从最快到最慢排序。这是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's = 39 步,Cagy's = 40。
为什么我的速度这么快?
你不能让preg_match() 比这更快。作为使用\K 的好处,输出数组也小了 50%。
// Will work regardless of backticks in SELECT clause:
echo preg_match('/FROM `\K[^`]+/',$sql,$out)?$out[0]:'failed';