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