web-dev-qa-db-ja.com

htmlソースからすべての改行を削除します

難読化は悪いアイデアだと思います。しかし、私はすべてのhtmlコードを1つの長い行に収めたいと思っています。すべてのhtmlタグはPHPを介して生成されるため、可能だと思います。 \n\rを正規表現から置き換えることは知っていましたが、これを行う方法がわかりません。不明な場合は、ここに例があります

$output = '<p>
              <div class="title">Hello</div>
           </p>';
echo $output;

ソースビューアーで<p><div class="title">Hello</div></p>として表示するには

39
mrN

たぶんこれ?

$output = str_replace(array("\r\n", "\r"), "\n", $output);
$lines = explode("\n", $output);
$new_lines = array();

foreach ($lines as $i => $line) {
    if(!empty($line))
        $new_lines[] = trim($line);
}
echo implode($new_lines);
46
seriousdev

おそらくこれを試すことができます。

// Before any output
ob_start();

// End of file
$output = ob_get_clean();
echo preg_replace('/^\s+|\n|\r|\s+$/m', '', $output);

これは、正規表現を台無しにしない限り、すべての出力をキャッチし、すべての改行文字と行の最初と最後の空白をすべて置き換える必要があります。

既にすべての出力を変数に収集している場合は、もちろん最後の行を直接使用して、出力のバッファリングをスキップできます:)

34
Svish

私のために働いた:

$output = str_replace(array("\r\n", "\r", "\n"), "", $output);
14
RayLoveless

できるよ :

$output = '<p>'.
              '<div class="title">Hello</div>'.
           '</p>';

こちらです、 $outputには行ジャンプは含まれません。

これも動作するはずです:

$output = preg_replace(array('/\r/', '/\n/'), '', $output);
5
krtek
$output = preg_replace('!\s+!m', ' ', $output);
3
ling

これはすでに十分に回答されていますが、各行の両端のスペースを切り取るだけでなく、それ以上のことができる場合があります。

  1. 最初に引用符内のすべてのテキストを抽出し(それらに触れたくない)、シーケンス番号のあるマーカーに置き換え、テキストとともにシーケンス番号を保存します
  2. <script></script>タグ内のすべてのテキストを抽出し、ステップ#1と同じことを行います
  3. すべての空白(\ n、\ rを含む)をスペースに置き換えます
  4. 1個を超えるすべてのスペースシーケンスを1個のスペースに置き換える
  5. すべての>_<><で置き換えます(_ =スペース)
  6. すべての_><_および</_><および</(_ =スペース)に置き換えます
  7. マーカーを実際のテキストに置き換えます

この手順により、HTMLファイル全体を潜在的に圧縮できます。これは、HTMLタグ内の複数の空白テキストが単一のスペースとして解釈されるという事実を利用しています。

1
Stephen Chung

<div>内部<p>-仕様が有効ではありません。

変数に保存する必要がない場合は、これを使用できます:

?><div><?php
    ?><div class="title">Hello</div><?php
?></div><?php
0
happy_marmoset

これは上記の改善された機能です。テキスト領域の保護を追加し、タグであるものは何も変更されません。

ループ内のstrlenも削除しました(静的)。

これは、保護された部分をチェックするためのワンパスフィルターとしてより高速に実行される可能性があります。このような小さなprotected_parts配列の場合、$strを4回ループするよりも効率的です。

また、これは修正しません:class = ""(=と "の間の余分なスペース)タグ内のものとして。

function MinifyHTML($str) {
$protected_parts = array('<pre>,</pre>','<textarea>,</textarea>', '<,>');
$extracted_values = array();
$i = 0;
foreach ($protected_parts as $part) {
    $finished = false;
    $search_offset = $first_offset = 0;
    $end_offset = 1;
    $startend = explode(',', $part);
    if (count($startend) === 1) $startend[1] = $startend[0];
    $len0 = strlen($startend[0]); $len1 = strlen($startend[1]);
    while ($finished === false) {
        $first_offset = strpos($str, $startend[0], $search_offset);

        if ($first_offset === false) $finished = true;
        else {
            $search_offset = strpos($str, $startend[1], $first_offset + $len0);
            $extracted_values[$i] = substr($str, $first_offset + $len0, $search_offset - $first_offset - $len0);
            $str = substr($str, 0, $first_offset + $len0).'$$#'.$i.'$$'.substr($str, $search_offset);
            $search_offset += $len1 + strlen((string)$i) + 5 - strlen($extracted_values[$i]);
            ++$i;
        }
    }
}
$str = preg_replace("/\s/", " ", $str);
$str = preg_replace("/\s{2,}/", " ", $str);
$replace = array('> <'=>'><', ' >'=>'>','< '=>'<','</ '=>'</');
$str = str_replace(array_keys($replace), array_values($replace), $str);

for ($d = 0; $d < $i; ++$d)
    $str = str_replace('$$#'.$d.'$$', $extracted_values[$d], $str);

return $str;
}
0
piranxa

これは(私がテストした限りでは)Stephen Chungの指示の実際の実装です。私は5番に完全に納得しているわけではありませんが、とにかくそれを含めています。

保護したいものをprotected_pa​​rts配列に入れます。それらを保護するためにそれを行います。開始ビットと終了ビットが異なる場合(HTMLタグの場合と同様)、コンマを使用してそれらを区切ります。

また、これがこれを行うための最も最適化された方法であるかどうかはわかりませんが、それは私のために機能し、合理的に速いようです。自由に改善するなどしてください(あなたもそうしたら教えてください!)

function MinifyHTML($str) {
    $protected_parts = array("<pre>,</pre>", "\"", "'");
    $extracted_values = array();
    $i = 0;

    foreach ($protected_parts as $part) {
        $finished = false;
        $search_offset = 0;
        $first_offset = 0;
        $startend = explode(",", $part);
        if (count($startend) == 1) { $startend[1] = $startend[0]; }

        while (!$finished) {
            $first_offset = strpos($str, $startend[0], $search_offset);
            if ($first_offset === false) { $finished = true; }
            else {
                $search_offset = strpos($str, $startend[1], $first_offset + strlen($startend[0]));
                $extracted_values[$i] = substr($str, $first_offset + strlen($startend[0]), $search_offset - $first_offset - strlen($startend[0]));
                $str = substr($str, 0, $first_offset + strlen($startend[0]))."$#".$i."$".substr($str, $search_offset);
                $search_offset += strlen($startend[1]) + strlen((string)$i) + 3 - strlen($extracted_values[$i]);
                $i++;
            }
        }
    }

    $str = preg_replace("/\s/", " ", $str);
    $str = preg_replace("/\s{2,}/", " ", $str);
    $str = str_replace("> <", "><", $str);
    $str = str_replace(" >", ">", $str);
    $str = str_replace("< ", "<", $str);
    $str = str_replace("</ ", "</", $str);

    for ($i = count($extracted_values); $i >= 0; $i--) {
        $str = str_replace("$#".$i."$", $extracted_values[$i], $str);
    }

    return $str;
}
0