2012-11-05 165 views
4

我想格式化一個sql語句,使其更容易閱讀。PHP preg_replace所有逗號除括號內的那些逗號

$sql = "SELECT title, url, author, FROM_UNIXTIME(published, '%Y') AS year FROM articles WHERE id IN(2010,2011,2012)"; 

預期的結果:

SELECT 
    title, 
    url, 
    author, 
    FROM_UNIXTIME(published, '%Y') AS year 
FROM 
    articles 
WHERE 
    id IN(2010, 2011, 2012) 

它只是讓喜歡選擇那些關鍵字,FROM,WHERE ...對自己的線條,
然後將每個逗號後換行+標籤,但,而不是括號內的逗號。

這裏是我的學嘗試

$sql = preg_replace('/(SELECT|FROM[^_]|WHERE)/', "\n$1\n\t", $sql); 

function replace_commas($matches) { 
    return str_replace(",", ",\n\t", $matches[0]); 
} 

$sql = preg_replace_callback("/(.*)/s", 'replace_commas', $sql); 
//       ^^^^^^^ 
//       stuck here 

困在這裏:如何排除裏面的格局括號內的逗號?

回答

5

如果可以有任意數量的嵌套圓括號,最好在回調函數內手動執行(通過逐字符地逐個字符串並計算圓括號)。如果你可以確保你只有一層圓括號所有的圓括號都匹配(這樣你就有了一個有效的語法),你可以使用一個前瞻,它斷言沒有)直到下一個(或者結束字符串:

'/,(?=[^)]*(?:[(]|$))/' 

你甚至不需要現在的回調。只需使用preg_replace即可。

問題依然是,這也會考慮到SQL語句中字符串中的括號,這就是爲什麼這個問題對於正則表達式來說通常有點過於強硬,並且只能在它們強加上述條件時才能解決。

+0

我確實有一些多層圓括號,但現在您的模式並不會影響它們太多。它的效果很好。謝謝。 – user1643156