智能地从字符串中删除多余的缩进

时间:2010-05-12 22:34:39

标签: php

我正在尝试从字符串中删除一些过多的缩进,在这种情况下它是SQL,因此可以将其放入日志文件中。所以我需要找到最小量的缩进(也就是制表符)并从每行的前面删除它,但下面的代码最终打印出完全相同的,任何想法?

换句话说,我想采取以下内容(注意:StackOverflow编辑器将我的选项卡转换为空格,在代码中,一个选项卡模拟4个空格,但它确实是一个\ t字符)

        SELECT 
            blah
        FROM
            table
        WHERE
            id=1

并将其转换为

SELECT 
    blah
FROM
    table
WHERE
    id=1

这是我尝试过的代码

$sql = '
        SELECT 
            blah
        FROM
            table
        WHERE
            id=1
';

// it's most likely idented SQL, remove any idention
$lines = explode("\n", $sql);
$space_count = array();
foreach ( $lines as $line )
{
    preg_match('/^(\t+)/', $line, $matches);
    $space_count[] = strlen($matches[0]);
}

$min_tab_count = min($space_count);

$place = 0;
foreach ( $lines as $line )
{
    $lines[$place] = preg_replace('/^\t{'. $min_tab_count .'}/', '', $line);
    $place++;
}

$sql = implode("\n", $lines);

print '<pre>'. $sql .'</pre>';

2 个答案:

答案 0 :(得分:1)

似乎问题是

strlen($matches[0])  

为第一行和最后一行返回0和1,这不是我实际想要的最小值3,所以快速破解

  • 修剪SQL
  • 如果长度小于2
  • ,则跳过计算长度

不是最优雅的解决方案,但它始终有效,因为此代码中的标签通常为4+。这是固定代码:

$sql = '
            SELECT 
                blah
            FROM
                table
            WHERE
                id=1
';

// it's most likely idented SQL, remove any idention
$lines = explode("\n", $sql);
$space_count = array();
foreach ( $lines as $line )
{
    preg_match('/^(\t+)/', $line, $matches);
    if ( strlen($matches[0]) > 1 )
    {
        $space_count[] = strlen($matches[0]);
    }
}

$min_tab_count = min($space_count);

$place = 0;
foreach ( $lines as $line )
{
    $lines[$place] = preg_replace('/^\t{'. $min_tab_count .'}/', '', $line);
    $place++;
}

$sql = implode("\n", $lines);

print $sql;

答案 1 :(得分:1)

private function cleanIndentation($str) {
        $content = '';

        foreach(preg_split("/((\r?\n)|(\r\n?))/", trim($str)) as $line) {
            $content .= " " . trim($line) . PHP_EOL;
        }

        return $content;
    }