我有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>
答案 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的用途。