从html中删除空格

时间:2011-03-19 12:51:13

标签: php html css whitespace

我有html代码,如:

<div class="wrap">
    <div>
        <div id="hmenus">
            <div class="nav mainnavs">
                <ul>
                    <li><a id="nav-questions" href="/questions">Questions</a></li>
                    <li><a id="nav-tags" href="/tags">Tags</a></li>
                    <li><a id="nav-users" href="/users">Users</a></li>
                    <li><a id="nav-badges" href="/badges">Badges</a></li>
                    <li><a id="nav-unanswered" href="/unanswered">Unanswered</a></li>
                </ul>
            </div>
        </div>
    </div>
</div>

如何通过php删除标签之间的空格?

我们应该得到:

<div class="wrap"><div><div id="hmenus"><div class="nav mainnavs"><ul><li><a id="nav-questions" href="/questions">Questions</a></li><li><a id="nav-tags" href="/tags">Tags</a></li><li><a id="nav-users" href="/users">Users</a></li><li><a id="nav-badges" href="/badges">Badges</a></li><li><a id="nav-unanswered" href="/unanswered">Unanswered</a></li></ul></div></div></div></div>

15 个答案:

答案 0 :(得分:51)

$html = preg_replace('~>\s+<~', '><', $html);

但我没有看到这一点。如果您尝试缩小数据大小,可以选择更好的选项。

答案 1 :(得分:10)

自问这个问题以来已经有一段时间了,但我仍然认为有必要发布这个答案,以帮助有同样问题的人。

这些解决方案都不适用于我,因此我提出了这个解决方案:使用output_buffer

函数ob_start接受回调作为参数,在输出之前应用于整个字符串。因此,如果在刷新输出之前从字符串中删除空格,那么就完成了。

/** 
 * Remove multiple spaces from the buffer.
 * 
 * @var string $buffer
 * @return string
 */
function removeWhitespace($buffer)
{
    return preg_replace('/\s+/', ' ', $buffer);
}

ob_start('removeWhitespace');

<!DOCTYPE html>
<html>
    <head></head>
    <body></body>
</html>

ob_get_flush();

上面会打印出类似的内容:

<!DOCTYPE html> <html> <head> </head> <body> </body> </html>

希望有所帮助。

如何在OOP中使用

如果您在PHP中使用面向对象的代码,则可能需要使用对象内部的回调函数。

如果您有一个名为 HTML 的类,则必须使用此代码行

ob_start(["HTML","removeWhitespace"]); 

答案 2 :(得分:4)

$html = preg_replace('~>\s*\n\s*<~', '><', $html);

我认为这是<b>Hello</b> <i>world</i>问题的解决方案。想法是仅在有新行时删除空格。它适用于常见的HTML语法:

<div class="wrap">
    <div>
    </div>
</div>

答案 3 :(得分:4)

万一有人需要这个, 我创造了@Martin Angelova的回应和@Savas Vedova的功能,并提出了

<?php 
   function rmspace($buffer){ 
        return preg_replace('~>\s*\n\s*<~', '><', $buffer); 
   };
?>
<?php ob_start("rmspace");  ?>
   //Content goes in here 
<?php ob_end_flush(); ?>

它解决了我的问题。 注意:我没有测试服务器开销,请确保在生产中使用之前进行测试

答案 4 :(得分:3)

RegEx替换可以做到这一点,例如:

$result = preg_replace('!\s+!smi', ' ', $content);

答案 5 :(得分:2)

感谢您发布此问题。问题确实是在某些环境中处理空白错误。虽然正则表达式解决方案适用于一般情况,但快速黑客删除前导空格并在每行末尾添加标记。 PHP会在关闭后删除换行符吗?&gt;。 E.g:

<ul><?php ?>
<li><a id="nav-questions" href="/questions">Questions</a></li><?php ?>
<li><a id="nav-tags" href="/tags">Tags</a></li><?php ?>
<li><a id="nav-users" href="/users">Users</a></li><?php ?>
<li><a id="nav-badges" href="/badges">Badges</a></li><?php ?>
<li><a id="nav-unanswered" href="/unanswered">Unanswered</a></li><?php ?>
</ul>

显然,出于各种原因,这是次优的,但它可以在不影响整个工具链的情况下解决本地化问题。

答案 6 :(得分:2)

array reduce功能:

$html = explode("\n", $html);
function trimArray($returner, $value) {
    $returner .= trim($value);
    return $returner;
}
echo $html = array_reduce($html, 'trimArray');

答案 7 :(得分:2)

由于gpupo的帖子为许多不同类型的间距格式提供了最干净的解决方案。然而,一个次要但重要的作品最后被遗忘了!最后一个字符串修剪:-p

以下是经过测试和运作的解决方案。

function compress_html($content)
{
    $i       = 0;
    $content = preg_replace('~>\s+<~', '><', $content);
    $content = preg_replace('/\s\s+/',  ' ', $content);

    while ($i < 5)
    {
        $content = str_replace('  ', ' ', $content);
        $i++;
    }

    return trim($content);
}

答案 8 :(得分:1)

//...
public function compressHtml($content)
{
    $content = preg_replace('~>\s+<~', '><', $content);
    $content = preg_replace('/\s\s+/', ' ', $content);
    $i = 0;
    while ($i < 5) {
        $content = str_replace('  ', ' ', $content);
        $i++;    
    }

    return $content;
}

答案 9 :(得分:1)

如果您有8位ASCII码,则将其删除并将字符保留在128-255之间

 $text = preg_replace('/[\x00-\x1F\xFF]/', " ", $text );

如果您使用的是UTF-8编码的字符串,则可以完成工作

$text = preg_replace('/[\x00-\x1F\x7F]/u', '', $text);

了解更多信息 你有这个链接 more information

答案 10 :(得分:0)

使用正则表达式,例如:

>(\s).*?<

答案 11 :(得分:0)

<?php
    define(COMPRESSOR, 1);

        function remove_html_comments($content = '') {
            return preg_replace('/<!--(.|\s)*?-->/', '', $content);
        }
        function sanitize_output($buffer) {
            $search = array(
                '/\>[^\S ]+/s',  // strip whitespaces after tags, except space
            '/[^\S ]+\</s',  // strip whitespaces before tags, except space
            '/(\s)+/s'       // shorten multiple whitespace sequences
          );

          $replace = array(
             '>',
             '<',
             '\\1'
          );

          $buffer = preg_replace($search, $replace, $buffer);
          return remove_html_comments($buffer);
        }
        if(COMPRESSOR){ ob_start("sanitize_output"); }
    ?>

    <html>  
        <head>
          <!-- comment -->
          <title>Example   1</title>
        </head>
        <body>
           <p>This is       example</p>
        </body>
    </html>


    RESULT: <html><head><title>Example 1</title></head><body><p>This is example</p></body></html> 

答案 12 :(得分:0)

我为我使用了此正则表达式,它的工作原理就像一个魅力:

preg_replace('/[ \t]+(?!="|\')/', '', $html);

这些模式寻找空格和制表符(至少一个),{strong>不后跟,后跟"'。这是为了避免删除html属性之间的空格

答案 13 :(得分:0)

这对我有用,添加/删除特殊情况很容易。适用于CSS,HTML和JS。

function inline_trim($t)
{
    $t = preg_replace('/>\s*\n\s*</', '><', $t); // line break between tags
    $t = preg_replace('/\n/', ' ', $t); // line break to space
    $t = preg_replace('/(.)\s+(.)/', '$1 $2', $t); // spaces between letters
    $t = preg_replace("/;\s*(.)/", ';$1', $t); // colon and letter
    $t = preg_replace("/>\s*(.)/", '>$1', $t); // tag and letter
    $t = preg_replace("/(.)\s*</", '$1<', $t); // letter and tag
    $t = preg_replace("/;\s*</", '<', $t); // colon and tag
    $t = preg_replace("/;\s*}/", '}', $t); // colon and curly brace
    $t = preg_replace("/(.)\s*}/", '$1}', $t); // letter and curly brace
    $t = preg_replace("/(.)\s*{/", '$1{', $t); // letter and curly brace
    $t = preg_replace("/{\s*{/", '{{', $t); // curly brace and curly brace
    $t = preg_replace("/}\s*}/", '}}', $t); // curly brace and curly brace
    $t = preg_replace("/{\s*([\w|.|\$])/", '{$1', $t); // curly brace and letter
    $t = preg_replace("/}\s*([\w|.|\$])/", '}$1', $t); // curly brace and letter
    $t = preg_replace("/\+\s+\'/", "+ '", $t); // plus and quote
    $t = preg_replace('/\+\s+\"/', '+ "', $t); // plus and double quote
    $t = preg_replace("/\'\s+\+/", "' +", $t); // quote and plus
    $t = preg_replace('/\"\s+\+/', '" +', $t); // double quote and plus

    return $t;
}

答案 14 :(得分:-2)

你不需要。

GZip压缩是所有现代网络服务器的一项功能,在提供内容时,使用此功能可以大大超越您所获得的任何“收益”。

不要这样做。毫无意义。这就是gzip的用途。