【问题标题】:RegEx Whitespace Reduction + Textarea Exclusion正则表达式空格减少 + 文本区域排除
【发布时间】:2012-09-03 15:03:05
【问题描述】:

我正在使用/\s+/ 将所有空白字符减少到一个(在每个组中)。这目前用于缩小 HTML,但是 textareas 需要额外的换行符,否则会被过滤。如何修改此正则表达式以忽略 <textarea></textarea> 标签内的换行符?

此外,文本区域可能具有 idclass 等属性。

任何帮助将不胜感激。

【问题讨论】:

  • 您能否将整个文档定义为非文本区域和文本区域的交替,交替?
  • @RobW 我认为根本不需要进行 HTML 最小化,但不幸的是,这是客户的要求。我试图找到一个lightweight 方法,我在这里。
  • 你不能只打开对 HTML 内容的 gzip 压缩并完成它吗?
  • @Eregrith 我已经考虑过这个想法,但我更喜欢让实现尽可能轻松。如果这不能用 RegEx 完成,我会试试你的解决方案。
  • @Joey 已经实现。然而,这似乎不是缩小的原因。客户显然想制作代码unreadable,不管我多么强调缩小只会对解码器造成轻微的烦恼。

标签: html regex textarea


【解决方案1】:

好的,这是 PHP 中的通用解决方案,希望用您用于此任务的任何语言重写它会很容易。

$raw = '
  My   line   is   here <textarea>And 
there</textarea> there   and everywhere';

$chunks = preg_split('#(<textarea>.+?</textarea>)#si', 
  $raw, null, 
  PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); // -- 1

$chunks_length = count($chunks);
for ($index = 0; 
     $index < $chunks_length; 
     $index += 2) { // -- 2
  $chunks[$index] = preg_replace('#(\s)+#', '$1', $chunks[$index]); // -- 3
}

var_dump(implode('', $chunks));
// My line is here <textarea>And 
// there</textarea> there and everywhere

这就是这里发生的事情:使用--1 行,我们将您的文本拆分为片段数组。这个数组中具有奇数索引 [1, 3, ...] 的元素实际上是 'textarea' 块,因为我们将 preg_split 设置为在 'delimiter-capturing' 模式下工作。关键是我们不会处理它们(在for 循环中跳过它们),只会压缩'content'元素的空白(--3)。

不过,这种方法非常脆弱,正如 Rob W 正确提到的:并非 HTML 中的所有空白都可以轻松压缩。

附: s 正则表达式中的修饰符出于某种原因使用;否则 .+? 模式将无法捕获结束 \n 符号(防止正确捕获多行块)。

【讨论】:

    【解决方案2】:

    使用带有不区分大小写修饰符的正则表达式模式/(?:\s+(?![^&lt;]*&lt;\/textarea&gt;)|[^\S\n\r]+)/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2014-06-04
      相关资源
      最近更新 更多