[英]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.