Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 智能地删除字符串中的多余缩进_Php - Fatal编程技术网

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

Php 智能地删除字符串中的多余缩进,php,Php,我试图从字符串中删除一些多余的缩进,在本例中是SQL,因此可以将其放入日志文件中。因此,我需要找到最小数量的缩进(也称为制表符),并将其从每行的前面删除,但下面的代码最终打印出完全相同的内容,有什么想法吗 换句话说,我希望采用以下内容(注意:StackOverflow editor将我的制表符转换为空格,在代码中,制表符模拟4个空格,但实际上是\t字符) 并将其转换为 SELECT blah FROM table WHERE id=1 这是我尝试过但失败的代码 $sq

我试图从字符串中删除一些多余的缩进,在本例中是SQL,因此可以将其放入日志文件中。因此,我需要找到最小数量的缩进(也称为制表符),并将其从每行的前面删除,但下面的代码最终打印出完全相同的内容,有什么想法吗

换句话说,我希望采用以下内容(注意:StackOverflow editor将我的制表符转换为空格,在代码中,制表符模拟4个空格,但实际上是\t字符)

并将其转换为

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>';
$sql=>
挑选
废话
从…起
桌子
哪里
id=1
';
//很可能是识别的SQL,删除任何识别
$lines=explode(“\n”,$sql);
$space_count=array();
foreach($line作为$line)
{
预匹配(“/^(\t+/”,$line,$matches);
$space_count[]=strlen($matches[0]);
}
$min\u tab\u count=min($space\u count);
$place=0;
foreach($line作为$line)
{
$lines[$place]=preg_replace('/^\t{.$min_tab_count.}/'.'$line);
$place++;
}
$sql=内爆(“\n”,$line);
打印“”$sql‘’;

问题似乎是

$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;
对于第一行和最后一行,返回0和1,这不是我实际想要的最小值3,因此需要快速破解

  • 修剪SQL
  • 如果长度小于2,则跳过计数
这不是最优雅的解决方案,但它总是有效的,因为在这段代码中,标签通常是4+计数。以下是固定代码:

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

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

        return $content;
    }

您的SQL字符串前面有空格,而您正在计算制表符。@Nate,实际上是将我的粘贴从制表符转换为空格,但它们实际上是代码中的制表符。在开始更正缩进之前,您应该将每行开头的所有空格转换为制表符七,尽管我已经解决了我的问题,在我结束这个问题之前,我正在等待是否有人有更好的答案。
$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;
private function cleanIndentation($str) {
        $content = '';

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

        return $content;
    }