[英]Get after last occurrence in string using regular expressions
我有一個SQL字符串,我需要從主“ FROM”值中獲取表名。 我需要找到最后一個“ FROM”出現,其后可能有也可能沒有其他約束。 字符串顯示的幾種方法如下:
$input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account WHERE title = 'president'";
$input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account LIMIT 1";
$input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account OFFSET 3";
$input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account ANYTHING_HERE_REALLY";
$input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account";
所有人的預期輸出為: 帳戶
從搜尋論壇中的任何活動開始,這就是我要走的方向,但是我知道這是不正確的。
preg_match('/.*FROM\s([^]]+)\sWHERE/', $input, $output);
首先,將正則表達式用於級聯內容(如級聯查詢)是一種不好的做法。 但是我們開始...
只需匹配FROM
之后的非空格序列。
注意:由於.*
的Kleene星的貪婪 ,它肯定會尋找最新的比賽。 您的模式實際上旨在通過期望WHERE
子句來過度說明問題。
preg_match('/.*FROM\s+(\S+)/', $input, $output);
示例 (帶有給定的示例和交互式php -a
):
$ php -a
php > $input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account WHERE title = 'president'";
php > preg_match('/.*FROM\s+(\S+)/', $input, $output);var_dump($output);
array(2) {
[0]=>
string(80) "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account"
[1]=>
string(7) "Account"
}
php > $input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account LIMIT 1";
php > preg_match('/.*FROM\s+(\S+)/', $input, $output);var_dump($output);
array(2) {
[0]=>
string(80) "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account"
[1]=>
string(7) "Account"
}
php > $input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account OFFSET 3";
php > preg_match('/.*FROM\s+(\S+)/', $input, $output);var_dump($output);
array(2) {
[0]=>
string(80) "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account"
[1]=>
string(7) "Account"
}
php > $input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account ANYTHING_HERE_REALLY";
php > preg_match('/.*FROM\s+(\S+)/', $input, $output);var_dump($output);
array(2) {
[0]=>
string(80) "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account"
[1]=>
string(7) "Account"
}
php > $input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account";
php > preg_match('/.*FROM\s+(\S+)/', $input, $output);var_dump($output);
array(2) {
[0]=>
string(80) "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account"
[1]=>
string(7) "Account"
}
這應該為您工作:
preg_match_all('/FROM\s?(\S+)/', $input, $output);
$輸出:
Array
(
[0] => Array
(
[0] => FROM Contact
[1] => FROM Account
)
[1] => Array
(
[0] => Contact
[1] => Account
)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.