javascript - 匹配 <pre> 内的 <pre> 和 </pre>

标签 javascript regex

看似不可能完成的任务。我有一个服务器输出,其中包含 <pre> 内的转储。不幸的是,我碰巧转储了一个包含一些 html 标签的文件。我需要转换任何内部 </pre> HTML 实体,以便当我将数据附加到 DOM 时结构不会被破坏:

   <pre> 
      ...
      echo '<pre>'
      cat gcc.log
      echo '</pre>'
      ...
   </pre>

但是有一个明显的规则 - 总会有 echo '之前<pre></pre> 。可能不完全是echo '</pre>不过。

基于此,我构造了已经相当复杂的正则表达式:

   <pre>   - The beginning tag
       ([\s\S]*?) - Any characters including new lines
           (?:(echo[^\n]+) - Echo and anything but new line
               (<pre>|<\/pre>|<\/xmp>|<xmp>)) - The enclosing tags
           ([\s\S]*?) - More random characters
   <\/pre>

问题是,只要有两个 </pre>在代码中,正则表达式仅匹配第一个,并将第二个视为随机字符 - ([\s\S]*?) .

如何使正则表达式首先尝试匹配显式字符,然后匹配 .*?东西?

您可以在 http://regex101.com 现场尝试该功能。

哦,我真的无法在服务器上修复它

最佳答案

这可能有效(假设标签在引号内并且引号特别平衡):

var html = "<pre>\n      ...\n      echo '<pre>'\n      cat gcc.log\n      echo '</pre>'\n      ...\n</pre>";

html = html.replace(/(<pre[^>]*>)((?:(?=((["'])(?:(?=(\\.|[^\\"']+|(?!\5)["']))\4)*\5|[^'<]+|<(?!\/pre>)))\3)*)<\/pre>/g, 
                    function(_, g1, g2) {
                        g2 = g2.replace(/</g, '&lt;');
                        g2 = g2.replace(/>/g, '&gt;');
                        return g1 + g2 + '</pre>';
                    }
                   );

console.log(html);

此模式使用以下技巧模拟原子组:(?>pattern) => (?:(?=(pattern))\1) 使用以下事实:前瞻的内容自然是原子的,以避免灾难性的回溯。

关于javascript - 匹配 <pre> 内的 <pre> 和 </pre>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23716852/

相关文章:

javascript - 从对象内部调用的函数是否可以访问该对象的范围?

javascript - AngularJS 自定义顺序和限制

Javascript getter/setter 作用域访问

javascript - 正则表达式更改字符串中的某些单词

regex - 加载 : "-complete Used Without -nargs"? 时出现慢性 ripgrep/vim 插件错误

javascript - Jquery,可拖动的div不会使用Firefox在内部自动调整 Accordion 的大小

javascript - 离线时获取 "real"设备时间的策略

regex - grep 文件名[星号] 返回意外结果

php - 匹配单个字符后跟数字并以 'c' 结尾的正则表达式

正则表达式将合并代码与双主题标签相匹配