5

我正在尝试格式化 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

卡在这里:如何排除模式中括号内的逗号?

4

1 回答 1

5

如果可以有任意数量的嵌套括号,最好在回调函数中手动进行(通过逐个字符遍历字符串并计算括号)。如果您可以确保只有一层括号并且所有括号都匹配(以便您具有有效的语法),您可以使用前瞻,它断言)直到下一个(或字符串末尾没有:

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

您现在甚至不需要回调。只需使用preg_replace.

问题仍然是,这也会考虑到 SQL 语句中字符串中的括号,这就是为什么这个问题对于正则表达式来说通常有点太难了,只有在你施加上述条件时才能用它们来解决。

于 2012-11-06T00:06:33.483 回答