替换段落中的所有(。)句点

时间:2009-12-23 23:40:50

标签: jquery jquery-selectors

我正在尝试用度数符号替换所有句点。使用each方法只替换段落标记内的第一个句点,而不是所有句点。我也试图使锚标记内的句点被忽略而不被替换,因此链接不会被我的代码中断。有人可以帮忙吗?

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

编辑: 我应该提到,我想保留“期间”课程,这使得它变得棘手。

2 个答案:

答案 0 :(得分:1)

带有g标志(全局)的正则表达式应该可以替换所有这些标记:

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

锚标签中不匹配句点是一个非常困难的问题,因为正则表达式在HTML文档中没有层次感上下文的感觉。我能想到的最好的方法是递归项目中你所定位和替换的HTML项目中的所有子项目,如果它是一个锚元素,则跳过它们。

答案 1 :(得分: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元素组合新的文本节点。