2010-05-12 60 views
1

我想從字符串中刪除一些過度的凹痕,在這種情況下它是SQL,因此它可以放入日誌文件中。所以我需要找到最小的縮進量(aka標籤)並將其從每行的前面移除,但是下面的代碼最終會打印出完全相同的任何想法?智能地從字符串中刪除多餘的凹痕

換句話說,我要採取以下(注: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>'; 
+1

你的SQL字符串中有空格在它的面前,你是不是計算的標籤。 – Nate 2010-05-12 22:38:05

+0

@Nate,實際上是將我的粘貼從標籤轉換爲空格,但它們確實是代碼中的選項卡。 – TravisO 2010-05-12 22:41:55

+0

在開始壓縮縮進之前,您應該在每行開頭處將所有空格轉換爲製表符 – MoreThanChaos 2010-05-12 22:43:44

回答

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
private function cleanIndentation($str) { 
     $content = ''; 

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

     return $content; 
    }