【问题标题】:Replace multiple and repeated occurrences of && with <b> and %% with <i> tag将多次重复出现的 && 替换为 <b> 并将 %% 替换为 <i> 标记
【发布时间】:2019-04-16 23:57:55
【问题描述】:

我正在开发一个自定义解析函数,我需要在其中解析一个字符串 多次重复出现 && 与 &lt;b&gt; 和 %% 与 &lt;i&gt; 标记。

我试过这个正则表达式。

html = html.replace(/[&][&](.+?)[&][&]/g, '<b>$1</b>');
html = html.replace(/[%][%](.+?)[%][%]/g, '<i>$1</i>');

上面的替换对我的意思是单个组很好

"&&This&& is a &&bold string&&" to "this is a bold string"

这给出了奇怪的结果,我有重复的字符串

&&&&This&&&& is a &&bold string&& 

&lt;b&gt;&amp;&amp;This&lt;/b&gt;&amp;&amp; is a &lt;b&gt;bold String&lt;/b&gt;

在解析结束组和开始组时需要帮助以将其替换为适当的 html 标记,例如

&lt;b&gt;&lt;b&gt;This&lt;/b&gt;&lt;/b&gt; is a &lt;b&gt;bold String&lt;/b&gt;

如果可能的话,只用一个&lt;b&gt;标签替换它

&lt;b&gt;This&lt;/b&gt; is a &lt;b&gt;bold String&lt;/b&gt;

【问题讨论】:

    标签: javascript regex html-parsing regex-group


    【解决方案1】:

    一种选择是在一行中匹配尽可能多的&amp;s,至少需要两个:

    console.log(
      '&&&&This&&&& is a &&bold string&&'
        .replace(/&{2,}(.*?)&{2,}/g, '<b>$1</b>')
    );

    请注意,如果您想用&lt;b&gt; 标记替换&amp;s 和用&lt;i&gt; 标记替换%s,您可以使用一个带有访问对象的替换函数的正则表达式:

    const obj = {
      '&': 'b',
      '%': 'i'
    };
    console.log(
      '&&&&This&&&& is a &&bold string&& and there are italics %%here%%%'
        .replace(
          /([%&])\1+(.*?)\1{2,}/g,
          (_, char, text) => `<${obj[char]}>${text}</${obj[char]}>`
        )
    );

    如果你想要求每一端的组是平衡,那么不要只捕获组中的一个字符,还要捕获&amp;s 或% 的整个子字符串s,因此您可以稍后反向引用整个子字符串:

    const obj = {
      '&': 'b',
      '%': 'i'
    };
    console.log(
      '&&&&This&& is a &&bold string&& and there are italics %%here%%%'
        .replace(
          /(([%&])\2+)(.+?)\1/g,
          (_, _2, char, text) => `<${obj[char]}>${text}</${obj[char]}>`
        )
    );

    如果节没有整齐地嵌套在其他节中(如&lt;b&gt;foo&lt;i&gt;bar&lt;/b&gt;baz&lt;/i&gt;),那么您将不得不使用替换&amp;&amp;s 的原始方法,然后再次遍历字符串并替换%%s :

    console.log(
      '&&&&This&& is a &&bold string&& and there are italics %%here%%%'
        .replace(/(&{2,})(.+?)\1/g, '<b>$2</b>')
        .replace(/(%{2,})(.+?)\1/g, '<i>$2</i>')
    );

    【讨论】:

    • 感谢您的快速回复。如果他们是偶数组,这可以正常工作。如果字符串有“'&&&&This&& is a &&bold string&&并且有斜体%%here%%%'”。 && 应该像 "'&&This is a" 或 &&This 那样显示。仅当开头有两个 && 结尾有两个时,才应该进行替换。
    • 查看编辑,捕获包含整个重复子字符串的另一个组,并在末尾反向引用它
    • 感谢@CertianPerformance。是的,这看起来不错,但是对于像 &&%%bold string&&%% 到 %%bold string
    • 猜猜你必须恢复到原来的方法,因为正则表达式不能一次性替换重叠的匹配项
    • 是的,我正在尝试,解析和替换单个组,以便替换所有 &&,%%。一般来说,斜体和粗体可以应用于文本右侧。
    【解决方案2】:

    如果我正确理解您的问题,那么转换的解决方案:

    &&&&This&&&& is a &&bold string&& 
    

    到:

    <b><b>This</b></b> is a <b>bold String</b>
    

    应该是:

    console.log('&&&&This&&&& is a &&bold string&& '
    .replace(/&&(.*?)&&/g, '<b>$1</b>'))

    【讨论】:

    • this 给出了 This 是一个 bold string 。这不是预期的@dacre-denny
    • 这是响应这部分 OP 的解决方案“需要帮助解析关闭和打开组以将其替换为适当的 html 标签,如&lt;b&gt;&lt;b&gt;This&lt;/b&gt;&lt;/b&gt; is a &lt;b&gt;bold String&lt;/b&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    相关资源
    最近更新 更多