Akıllıca bir dizeden fazla girinti çıkarma

1 Cevap

Ben SQL bulunuyor bu durumda, bir dizeden bazı aşırı girinti kaldırmak için çalışıyorum, bu yüzden bir günlük dosyası içine konabilir. Yani herhangi bir fikir, ben (sekmeler aka) girinti küçük miktarını bulmak ve her satırın önüne çıkarmak gerekir, ancak aşağıdaki kod tam olarak aynı yazdırarak biter?

Diğer bir deyişle, ben aşağıdaki almak istiyorum (NOT: StackOverflow editörü sekmesi 4 boşluk taklit, kodu, boşluk benim sekmeleri dönüştürülür, ama gerçekten bir \ t karakter)

        SELECT 
            blah
        FROM
            table
        WHERE
            id=1

ve dönüştürmek

SELECT 
    blah
FROM
    table
WHERE
    id=1

Burada denedim kod ve başarısız

$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>';

1 Cevap

Bu sorun görünüyor

strlen($matches[0])  

Aslında minimum olarak istediği 3 değil ilk ve son satır, döner için 0 ve 1, yani hızlı kesmek oldu

  • SQL Döşeme
  • o az 2 ise uzunluğunu sayma atlayın

Değil en zarif çözüm, ancak sekmeler 4 + bu kodu saymak genellikle çünkü her zaman çalışacağız. Burada sabit bir kod var:

$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;