我正在尝试格式化 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 语句中字符串中的括号,这就是为什么这个问题对于正则表达式来说通常有点太难了,只有在你施加上述条件的情况下才能用它们解决。
关于PHP preg_replace 除了括号内的所有逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13242360/