删除<pre></pre>以外的新行

时间:2009-09-13 20:34:11

标签: php

除了&lt; pre&gt;之外,我想从某些html(使用php)删除新行空白显然很重要的标签。

3 个答案:

答案 0 :(得分:7)

可能是3年后,但是......以下代码将删除所有换行符和空格,因为它不在预标签之外。干杯!

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'
        );

    $blocks = preg_split('/(<\/?pre[^>]*>)/', $buffer, null, PREG_SPLIT_DELIM_CAPTURE);
    $buffer = '';
    foreach($blocks as $i => $block)
    {
      if($i % 4 == 2)
        $buffer .= $block; //break out <pre>...</pre> with \n's
      else 
        $buffer .= preg_replace($search, $replace, $block);
    }

    return $buffer;
}

ob_start("sanitize_output");

答案 1 :(得分:1)

如果html格式正确,您可以依赖<pre>标签不允许嵌套的事实。进行两次传递:首先,您将输入拆分为预标记块和其他所有内容。您可以使用正则表达式执行此任务。然后从每个非pre块中删除新行,最后将它们全部重新连接在一起。

请注意,大多数html格式不正确,因此这种方法可能会限制您使用它的位置。

答案 2 :(得分:1)

拆分内容。这很容易用...

完成
$blocks = preg_split('/<(|\/)pre>/', $html);

请注意,因为$ blocks元素不包含pre开始和结束标记。我觉得假设HTML有效是可以接受的,因此你可以预期pre-blocks是数组中的每个其他元素(1,3,5,...)。使用$i % 2 == 1轻松测试。

示例“完整”脚本(根据需要进行修改)......

<?php
//out example HTML file - could just as easily be a read in file
$html = <<<EOF
<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <h1>Title</h1>
    <p>
      This is an article about...
    </p>
    <pre>
      line one
      line two
      line three
    </pre>
    <div style="float: right:">
      random
    </div>
    </body>
</html>
EOF;

//break it all apart...
$blocks = preg_split('/<(|\/)pre>/', $html);

//and put it all back together again
$html = ""; //reuse as our buffer
foreach($blocks as $i => $block)
{
  if($i % 2 == 1)
    $html .= "\n<pre>$block</pre>\n"; //break out <pre>...</pre> with \n's
  else 
    $html .= str_replace(array("\n", "\r"), "", $block, $c);
}

echo $html;
?>