2009-12-23 62 views
3

我试图用度符号替换所有句号。使用每种方法只会替换段落标记中的第一个句点,而不是全部。我也试图让anchor标记内的句点被忽略而不被替换,所以链接不会被我的代码破坏。谁能帮忙?替换段落中的所有(。)句点

$('div.post').each(function(){ 
    var $h = $(this); 
    $h.html($h.html().replace('.', '<span class="period">&deg;<\/span>')); 
}); 

编辑: 我应该提到,我想保留“期间”类,这使得它非常棘手。

+1

您可以使用适当的编码插入'°'符号,而不是使用HTML实体。这里不需要这个实体。 – 2009-12-23 23:46:56

+0

我已经更新了我的答案,增加了跨度的版本。 – Rich 2009-12-24 01:09:54

回答

1
var span = $('<span class="period">°</span>').get(0); 

$('p, p *').each(function (index,element) { 
    $.each(element.childNodes, function (index,node) { 
     if (node.nodeType == 3) { 
      $.each(node.nodeValue.split('.'), function (index,fragment) { 
       if (index > 0) { 
        element.insertBefore(span.cloneNode(true),node); 
       } 
       element.insertBefore(document.createTextNode(fragment),node); 
      }); 
      element.removeChild(node); 
     } 
    }); 
}); 

将解决该问题。关键的想法是将“段落”中的每个文本节点的内容拆分为“。”。字符,将每个片段转换为新的文本节点,然后使用包含它们之间的度数符号的span元素组装新的文本节点。

+0

非常感谢!完美工作。 – 2009-12-24 02:24:56

+0

不客气。你能接受答案吗? – Rich 2009-12-24 08:09:43

1

g标志(全局)的正则表达式应该工作,以取代所有的人:锚标签内

$h.html($h.html().replace(/\./g, '<span class="period">&deg;<\/span>')); 

不匹配时期是一个显著困难的问题,因为正则表达式没有感HTML文档中的分层上下文。我能想到的最好的方法就是遍历项目中所有HTML项目的子项目,并在它们内部进行替换,如果它是锚元素,则跳过它们。

+0

-1这也将取代海报明确表示他不想瞄准的锚位时期。 – 2009-12-23 23:45:55

+0

是的,因此我给OP的说明。然而,我很好奇,你为什么低估了这一点,而不是其他答案完全一样。 – Amber 2009-12-23 23:47:07

+0

我投票赞成两个:)其他人upvoted虽然。 – 2009-12-23 23:48:17