3

根据 htmlcompressor.com 的作者,这是无法做到的,因为它们具有语义含义。

这是一个特定的例子:

<meta name='description' content='Foo lets you save and share all your 
  web bookmarks / favorites in one place. It is free with no advertising for life, and 
  has straight forward privacy controls.'>

删除您拥有的返回字符:

<meta name='description' content='Foo lets you save and share all your web bookmarks / favorites in one place. It is free with no advertising for life, and has straight forward privacy controls.'>

这是我要发送到浏览器的单行。

我想使用一些字符串操作对我所有的 HTML 执行此操作。这是可能的还是有其他情况下返回字符有意义?有没有办法区分?

4

2 回答 2

2

根据 HTML4.01 规范(http://www.w3.org/TR/html4/struct/global.html#h-7.4.4.2),元素的content=""属性是,这意味着空格不重要:<meta />CDATA

CDATA 是来自文档字符集的字符序列,可能包括字符实体。用户代理应该如下解释属性值:

  • 用字符替换字符实体,
  • 忽略换行,
  • 用一个空格替换每个回车符或制表符。
  • 用户代理可以忽略 CDATA 属性值中的前导和尾随空格(例如,“myval”可以解释为“myval”)。作者不应使用前导或尾随空格声明属性值。

所以看起来htmlcompression的作者是错误的。

无论如何,尽管有相反的可怕警告,您可能可以使用正则表达式来解决这个问题。

我忘记了在正则表达式中组合“仅匹配这个组,并在这个子区域中替换”的语法,但是这个 hack 有效:

这个简单的正则表达式将捕获content=""属性的内容:

<meta.+content='(.*)'>

获得内容后,您可以直接进行'\r', '\n', ' ' -> ' '替换。

于 2013-10-10T21:30:56.480 回答
0

只要关于内容属性是 CDATA 的规范是正确的,网站管理员就可以通过 JavaScript 使用任何属性的值,例如给定示例中“元”标签的“内容”,并且压缩该属性的值会改变预期结果.

因此 htmlcompressor.com 的作者是正确的,因为它们具有压缩目的的语义含义。

<meta id="m1" name="item1" content="Sample stuff:

  1. This text is multiline on purpose.
  2. And the author expects it to remain this way after compression.

  So yes, it does matter...">

相同的元标记压缩:

<meta id="m2" name="item2" content="Sample stuff: 1. This text is multiline on purpose. 2. And the author expects it to remain this way after compression. So yes, it does matter...">

并显示差异:

<script>
  alert('"'
      + document.getElementById('m1').content
      + '"\n\n---------------\n\n"'
      + document.getElementById('m2').content + '"'
  );
</script>

Afaik,该站点的目标是在不改变生成的布局或功能的情况下压缩文档。

现场示例:http: //jsfiddle.net/7Qb74/

于 2013-10-29T14:05:39.893 回答