web-dev-qa-db-ja.com

HTMLから空白を削除します

次のような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>
35
James

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

しかし、この点はわかりません。データサイズを小さくしようとしている場合、より良いオプションがあります。

52
Czechnology

この質問が最初に尋ねられてからしばらく経ちましたが、同じ問題を抱える人々を支援するためにこの回答を投稿する必要があると私は考えています。

これらのソリューションはどれも私には採用されていませんでした。したがって、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"]); 
10
Savas Vedova
$html = preg_replace('~>\s*\n\s*<~', '><', $html);

これが<b>Hello</b> <i>world</i>問題の解決策だと思っています。アイデアは、新しい行がある場合にのみ空白を削除することです。次の一般的なHTML構文で機能します。

<div class="wrap">
    <div>
    </div>
</div>
4
Martin Angelov

誰かがこれを必要とする場合に備えて、@ 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
P.M

RegExの置換は、次のようなトリックを実行できます。

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

この質問を投稿していただきありがとうございます。問題は確かに特定の環境での空白のバグを扱っています。正規表現ソリューションは一般的なケースで機能しますが、簡単なハックのために、先頭の空白を削除し、各行の最後にタグを追加します。 PHPは終了?>の後に改行を削除します。例:

<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>

これはさまざまな理由で明らかに最適ではありませんが、ツールチェーン全体に影響を与えることなく、ローカライズされた問題に対して機能します。

2
Chris

array reduce 関数:

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

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);
}
2
tfont
//...
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;
}
1
gpupo

次のような正規表現を使用します。

>(\s).*?<
0
bluefoot
<?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> 
0
Rafael Menezes

私はこの正規表現を使用しましたが、それは魅力のように機能します:

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

これらのパターンは、スペースの空白とタブ(少なくとも1つ)を探します。つまり、後に続かない by "または'。これは、html属性間の空白の削除を回避するです。

0
alpham8