我正在尝试从字符串中删除一些过多的缩进,在这种情况下它是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>';
答案 0 :(得分:1)
似乎问题是
strlen($matches[0])
为第一行和最后一行返回0和1,这不是我实际想要的最小值3,所以快速破解
不是最优雅的解决方案,但它始终有效,因为此代码中的标签通常为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;
}