【问题标题】:use Javascript to wrap all regmarks with <sup> tags unless they already have <sup> tags [duplicate]使用 Javascript 用 <sup> 标签包装所有 regmark,除非它们已经有 <sup> 标签 [重复]
【发布时间】:2015-01-22 20:18:25
【问题描述】:

提前致谢。

我正在使用

  $(document).ready(function() {
           $("body").html(
    $("body").html().replace(/&reg;/gi, '<sup>&reg;</sup>').replace(/®/gi, '<sup>&reg;</sup>')
   );
        });

在regmarks周围添加下标,但如果®标记已经有标签,则添加上标两次。如果它已经存在,谁能帮我添加一个停止检查?

更新:: 我最终使用了这段代码,因为下面的答案干扰了我的 javascript 的其余部分。

 $(document).ready(function() {
   $("p,h1,h2,h3,h4, td").each(function(){
     $(this).html($(this).html().replace(/&reg;/gi, '<sup>&reg;</sup>').replace(/®/gi, '<sup>&reg;       
      </sup>').replace('<sup><sup>', '<sup>').replace('</sup></sup>', '</sup>'));
   });
 });

【问题讨论】:

  • 可能是一个奇怪的问题,但是:为什么?你为什么要上标一个已经上标的字符?
  • 我正在更新一个需要添加 regmarks 的旧版用户生成内容网站,一些 regmarks 之前被上标了,而有些则没有。 @Mike'Pomax'Kamermans
  • 这仍然是原始问题。为什么要在已经上标字符周围添加上标标记,而不是在旧版源中使用时删除多余的&lt;sup&gt;...&lt;/sup&gt;?

标签: javascript jquery


【解决方案1】:

你想要这个:

$("body").html(
  $("body").html()
    .replace(/((?!<sup>\s*))&reg;((?!\s*<\/sup>))/gi, '<sup>&reg;</sup>') // wrap &reg; if not wrapped yet
    .replace(/((?!<sup>\s*))®((?!\s*<\/sup>))/gi, '<sup>&reg;</sup>') // wrap ® if not wrapped yet
);

说明:

您可以在正则表达式本身中为包装标签构建测试之后,而不是按照其他人的建议并删除重复项。

例如,这个正则表达式只有在没有被SUP标签包围时才找到字符(实体):

/((?!&lt;sup&gt;\s*))®((?!\s*&lt;\/sup&gt;))/gi 和 /((?!&lt;sup&gt;\s*))&amp;reg;((?!\s*&lt;\/sup&gt;))/gi

JsFiddle 演示:http://jsfiddle.net/co3sy5zo/

Runnable Snippet:(使用原生 javascript 而不是 jQuery)

document.body.innerHTML = 
  document.body.innerHTML
    .replace(/((?!<sup>\s*))&reg;((?!\s*<\/sup>))/gi, '<sup>&reg;</sup>')
    .replace(/((?!<sup>\s*))®((?!\s*<\/sup>))/gi, '<sup>&reg;</sup>');
<sup>&reg;</sup>
&reg;
<sup>®</sup>
®
<sup> &reg; </sup>
<sup> ® </sup>
<sup>
   &reg; 
</sup>
<sup> ® 
</sup>
"Buy more Emo&reg; Jeans!"

【讨论】:

  • 感谢这正是我想要的。将它包装在 $(document).ready(){} 中完全有效。再次感谢!
  • @alrjoo 这不适用于 reg 中的空格。 jsfiddle.net/u6cqusue/1 我的回答在哪里 jsfiddle.net/u6cqusue/3
  • @Victory:好点 - OP 没有提到标签之间的空格,但我在正则表达式中添加了 \s* 以处理标签和内容之间的任何可选空格。注意:您使用的图案是滑坡;您将花费更多时间调试和维护代码,而您会在事后尝试过度纠正事情。最好只做所需的最少工作,而不是天真地转换所有内容并稍后尝试修复。 (您的代码可能会产生意想不到的后果;这是您的解决方案失败的一个示例:jsfiddle.net/u6cqusue/5)
  • 这也是一个很好的反例。我们不妨只链接到 SO 上最著名的答案:stackoverflow.com/questions/1732348/…
  • 很好的答案,谢谢!我可能会向使用它的人添加的唯一一件事就是尽可能缩小它的范围。从 $("body").html() 开始非常受欢迎,如果你有类似“main-content”区域或一些一致的顶级标签,你可以设置为顶级,它超级快并且完美运行!!谢谢:-)
【解决方案2】:

有更有效的方法可以做到这一点,但最简单的方法就是这样做:

$(document).ready(function() {
   $("body").html(
       $("body").html().replace(/&reg;/gi, '<sup>&reg;</sup>').replace(/®/gi, '<sup>&reg;</sup>').replace('<sup><sup>','<sup>').replace('</sup></sup>','</sup>');
   );
});

【讨论】:

    【解决方案3】:

    添加更多替换

    $("body").html().replace(/&reg;/gi, '<sup>&reg;</sup>').replace(/®/gi, '<sup>&reg;</sup>').replace('<sup><sup>', '<sup>').replace('</sup></sup>', '</sup>')
    

    【讨论】:

    • 不适用于替换之前添加的空格或换行符。
    • 他只是替换了旧的,所以没有空格或新行
    • 在“ ® ”上试一试;你会想做类似$("sup &gt; sup").each(function () { $(this).parent("sup").html("&amp;reg;");
    • 你是对的,谢谢 :-)
    【解决方案4】:

    不使用正则表达式解决方案,您可以将替换语句包装在另一个替换语句中,将&lt;sup&gt;&lt;sup&gt; 替换为&lt;sup&gt;,将&lt;/sup&gt;&lt;/sup&gt; 替换为&lt;/sup&gt;。

    另一种方法是搜索&amp;reg;,前后有一个空格,假设如果没有标签,就会有一个空格。

    【讨论】:

      【解决方案5】:

      您需要找到带有子“sup”的“sup”,然后将父 sup 设置为 html 的“®”

      $(document).ready(function() {
        $("body").html(
        $("body").html().replace(/&reg;/gi, '<sup>&reg;</sup>').replace(/®/gi, '<sup>&reg;</sup>')); // this will break in script tags and a few other places.
        $("sup sup").each(function () {  // find sup with child sup
            $(this).parent("sup").html("&reg;"); 
        });
       });
      

      这适用于原件在 reg " ® " 周围有空格的情况

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-29
        • 2023-03-10
        • 2019-03-10
        • 2016-06-04
        • 2020-10-19
        • 2020-01-31
        • 2014-08-23
        • 1970-01-01
        相关资源
        最近更新 更多