【问题标题】:Less or greater than characters except html tags?小于或大于除 html 标签外的字符?
【发布时间】:2022-01-12 12:30:12
【问题描述】:

我需要替换小于或大于 (< >) 的字符,但保留任何 html 标签(简单标签会像 <b>text</b> 一样不带参数)。 所以下面的输入:

<b>> 0.5 < 0.4</b> - <>

应该是:

<b>&gt; 0.5 &lt; 0.4</b> - &lt;&gt;

我现在设法找到和编辑的是这个 expr:

<\/?[a-z][a-z0-9]*[^>\s]*>|([<>])

它将&lt;&gt; 字符分组,但它也匹配我不需要替换的标签

统一更新: 感谢@Sree Kumar,这是最终的功能:

String.prototype.replaceAt = function (index, char) {
    let arr = this.split('');
    arr[index] = char;
    return arr.join('');
};

String.prototype.escape = function () {
    let p = /(?:<[a-zA-Z]+>)|(?:<\/[a-zA-Z]+>)|(?<lt><)|(?<gt>>)/g,
        result = this,
        match = p.exec(result);

    while (match !== null) {
        if (match.groups.lt !== undefined) {
            result = result.replaceAt(match.index, '&lt;');
        }
        else if (match.groups.gt !== undefined) {
            result = result.replaceAt(match.index, '&gt;');
        }
        match = p.exec(result);
    }
    return result;
};

【问题讨论】:

  • 哪些标签是“简单”的?请提供明确的要求。
  • 这能回答你的问题吗? regex to escape non-html tags' angle brackets
  • @WiktorStribiżew 任何没有参数的标签都可以,我需要保持简单的 html 格式。如果我设法保留带有参数的标签会很好,但这不是必需的
  • .replace(/&lt;\s*\/?\s*\w+\s*\/?\s*&gt;|(&lt;)|(&gt;)/g, (m, g1, g2) =&gt; g2 ? '&amp;gt;' : g1 ? '&amp;lt;' : m) 之类的东西可能会起作用。或.replace(/&lt;\s*\/?\s*\w+[^&gt;]*&gt;|(&lt;)|(&gt;)/g, (m, g1, g2) =&gt; g2 ? '&amp;gt;' : g1 ? '&amp;lt;' : m)。这并不精确,但可能就足够了。为了使其更精确,您需要列出标签,以避免匹配 &lt;my_word&gt; 之类的字符串。
  • 您愿意使用命名组吗?然后,您可以命名您感兴趣的组并仅获得该组。如果是null,则丢弃。

标签: javascript regex


【解决方案1】:

试试这个正则表达式:

<(?!\/?\w+>)|(?<!<\w+|<\/\w+)>

说明

  • &lt;(?!\/?\w+&gt;) 查找所有 '
  • (?&lt;!&lt;\w+|&lt;\/\w+)&gt; 查找所有 '>' 符号(标签中除外)

您可以单独使用它们:

let str = '<b>> 0.5 < 0.4</b> - <>';
let lessThen = /<(?!\/?\w+>)/g;
let greaterThen = /(?<!<\w+|<\/\w+)>/g;

str = str.replace(lessThen, '&lt;');
str = str.replace(greaterThen, '&gt;');

console.log(str); // <b>&gt; 0.5 &lt; 0.4</b> - &lt;&gt;

注意! 它只在标签之间找到符号“”。它不检查 html 是否有效。对于像 &lt;a&gt;&lt;/b&gt; 这样的文本,它将找不到任何匹配项。

【讨论】:

    【解决方案2】:

    这是一种使用命名组的方法。也就是说,命名您想要的组并查找它。有时可能是nullundefined,因为它不匹配。因此,您必须添加空检查。

    注意 (?&lt;B&gt;...) 围绕“所需”组。另外,请注意第 5 行中的空检查。

    let p = /(?:<[a-zA-Z]+>)|(?:<\/[a-zA-Z]+>)|(?<B>[<>])/g
    let input = '<b>> 0.5 < 0.4</b> - <>';
    let match = p.exec( input );
    while( match !== null) {
        if( match.groups.B !== undefined ) console.log( match.groups.B );
        match = p.exec( input )
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2011-12-13
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多