簡體   English   中英

使用正則表達式在字符串中最后一次出現之后獲取

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM