簡體   English   中英

PHP preg_replace括號內的逗號除外

[英]PHP preg_replace all commas except those inside parentheses

我正在嘗試格式化sql語句,以使其更易於閱讀。

$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)

它只是使諸如SELECT,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

卡在這里:如何排除模式中括號內的逗號?

如果可以有任意數量的嵌套括號,則最好在回調函數中手動執行此操作(通過逐個字符地字符串並計算括號)。 如果您可以確保只有一層括號並且所有括號都匹配(因此您具有有效的語法),則可以使用前行,斷言沒有)直到下一個(或字符串的末尾)為止:

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

您甚至現在都不需要回調。 只需使用preg_replace

問題仍然是,這還將考慮到SQL語句中字符串內的括號,這就是為什么此問題通常對於正則表達式來說有點太難了,並且僅當您施加上述條件時才可以解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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