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

任意の数のネストされた括弧を使用できる場合は、コールバック関数内で手動で行うのが最善です (文字列を 1 文字ずつ調べて括弧を数えます)。かっこのレイヤーが 1 つだけで、すべてのかっこが一致していることを保証できる場合(構文が有効であるため)、先読みを使用して、文字列)の次(または最後まで存在しないことをアサートできます。

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

今はコールバックさえ必要ありません。を使用するだけpreg_replaceです。

それでも問題は、SQL ステートメントの文字列内の括弧も考慮されることです。そのため、この問題は通常、正規表現には少し難しすぎて、上記の条件を課す場合にのみ解決できます。

于 2012-11-06T00:06:33.483 に答える