2

假设我有一个这样的字符串:

<code>Blah blah Blah
enter code here</code>
<code class="lol">enter code here
fghfgh</code>

我想使用 javascript 将<code>标签之间的所有出现替换为 html 编码的回调函数。

这是我目前拥有的:

function code_parsing(data){
    //Dont escape & because we need that... in case we deliberately write them in
    var escape_html = function(data, p1, p2, p3, p4) {
        return p1.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
    };

    data = data.replace(/<code[^>]*>([\s\S]*?)<\/code>/gm, escape_html);
        // \[start\](.*?)\[end\]
        return data;        
    };

不幸的是,此功能正在删除"<code>"标签并仅用内容替换它们。我想保留<code>带有任意数量属性的标签。如果我只是将<code>标签硬编码回其中,我将丢失属性。

我知道正则表达式不是最好的工具,但其中不会有任何嵌套元素。

4

2 回答 2

3

您不应该使用正则表达式来解析 HTML。

也就是说,您需要使用括号组捕获要保留的内容,并让您的替换器将其附加到您操作的位上。

data.replace(/(<code[^>]*>)([\s\S]*?)(<\/code>)/g,
             function (_, startTag, body, endTag) {
               return startTag + escapeHtml(body) + endTag;
             })

要了解为什么不应该使用正则表达式来解析 HTML,请考虑这对

<code title="Shows how to tell whether x > y">if (x &gt; y) { ... }</code>

<code lang="js">node.style.color = "<code lang="css">#ff0000</code>"</code>

<code>foo</CODE >

<textarea><code>My HTML code goes here</code></textarea>

<code>foo  <!-- commented out </code> --></code>
于 2012-11-04T18:35:08.333 回答
1

简单的解决方案:在您的escape_html函数中,在对字符串完成操作之后,但在返回之前,将标签附加并添加到字符串并返回完整内容。

有时最简单的答案是最好的:)

于 2012-11-04T18:35:45.310 回答