PHP preg_replace 除了括号内的所有逗号

标签 php regex preg-replace

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

相关文章:

php - PDOStatement 类的对象无法转换为字符串(帮助)

javascript - 在特定时间段完成时隐藏按钮

regex - 对正则表达式的基本操作感到困惑

php - preg 替换 twitter 状态和 http 或 https PHP

php - 可编辑占位符问题

php - 在PHP中获取任意协议(protocol)的标准端口

Python 非贪婪正则表达式与模式之间的匹配

R - 是否可以优化或简化对 grepl() 的多次调用?

php - 在这种情况下是 preg_replace 还是 mb_ereg_replace?

php - 使用 preg_replace 清理小部件输出 HTML