2010-05-12 6 views
1

문자열에서 과도한 들여 쓰기를 제거하려고합니다.이 경우에는 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>'; 
+1

귀하의 SQL 문자열은 그것의 앞에 공간을 가지고 있으며, 대신 탭을 계산한다. – Nate

+0

@ 네이트는 실제로 내 붙여 넣기를 탭에서 공백으로 변환했지만 실제로 코드의 탭입니다. – TravisO

+0

들여 쓰기를 시작하기 전에 각 줄의 시작 부분에있는 모든 입력란을 탭으로 변환해야합니다. – MoreThanChaos

답변

1

실패 문제는

strlen($matches[0]) 

0을 반환하고 실제로 최소로 원하는 3없는 첫 번째와 마지막 줄 1, 그래서 빠른 해킹은 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; 
    } 
관련 문제