【发布时间】:2015-01-10 16:00:53
【问题描述】:
我正在使用缓冲区清理程序,如 PHP 手动注释中所见,但在 textareas 中出现双换行符时遇到问题。
当从我的数据库中提取一个包含双/三/四换行符的字符串并将其放入textarea 时,换行符将减少为仅一个换行符。
因此:是否可以让函数排除<pre>、<textarea> 和</pre>、</textarea> 之间的所有输出?
看到这个问题,How to minify php html output without removing IE conditional comments?,我想我需要使用preg_match,但是我不确定如何将它实现到这个函数中。
我正在使用的功能是
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 $buffer;
}
ob_start("sanitize_output");
是的,我正在使用这种消毒剂和GZIP 来获得尽可能小的尺寸。
【问题讨论】:
-
如果你没有时间,有一个非常愚蠢的解决方案:preg_replace 每个 textarea 和每个 pre 之间的所有内容到一个 random_string (将原始内容保存在数组中(random_string = 'original content');然后运行您的程序,然后将其替换回 (random_string -> array('random_string');。您可以轻松实现它,并等待更好的答案。如果可以等待,请等待,因为这是一个非常丑陋的解决方案: )。
-
只是一个随机的想法(我没有测试它):编写一个给定字符串的函数将其放入列表并返回唯一 ID(列表 f.e. 中的索引)。使用该函数“输出”要放入
<textarea>元素中的字符串。让 minifier ob 处理程序完成其工作,然后获取其输出,识别textarea元素并将 ID 替换为您之前保存的文本。找到像<textarea>1</textarea>这样的东西比去掉空格要容易得多;即使没有regex也可以完成(但使用它们更容易)。将列表和函数打包到一个类中,就可以开始了。 -
@axiac 这基本上是第一条评论的方法
-
糟糕,我之前没看过。现在我看到它非常相似。 Jacek 的建议是在运行问题中显示的函数之前识别并提取字符串。我的初衷是不要把它们放在输出中。
-
只是想一想:我不知道您为什么要对 HTML 中的作业进行这种清理,但通常没有特别需要使用这种技术压缩 HTML。您的问题没有真正简单的解决方案,也许这会产生您并不真正需要的巨大开销。也许没有清理功能,您的网站服务会更快。您应该考虑一下,也许可以在您的特定网站上测试它的好处。
标签: php preg-replace preg-match minify