2

次のような文字列があるとします。

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

<code>javascriptを使用して、タグ間のすべての出現箇所を、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 に答える