除了< pre>之外,我想从某些html(使用php)删除新行空白显然很重要的标签。
答案 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;
?>