【问题标题】:Replace all (.) periods within a paragraph替换段落中的所有 (.) 句点
【发布时间】:2009-12-23 23:40:50
【问题描述】:

我正在尝试用度数符号替换所有句点。使用 each 方法仅替换段落标记内的第一个句点,而不是全部替换。我还试图让锚标记内的句点被忽略而不是替换,这样链接就不会被我的代码破坏。有人可以帮忙吗?

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

编辑: 我应该提到,我想保留“时期”课程,这很棘手。

【问题讨论】:

  • 您可以插入带有适当编码的“°”符号,而不是使用 HTML 实体。这里不需要实体。
  • 我已经用一个添加跨度的版本更新了我的答案。

标签: jquery jquery-selectors


【解决方案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 元素组合起来。

【讨论】:

  • 非常感谢!完美运行。
【解决方案2】:

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

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

在锚标记中不匹配句点是一个非常困难的问题,因为正则表达式在 HTML 文档中没有层次上下文的意义。我能想到的最佳方法是递归遍历您要定位其 HTML 的项目中的所有子项目并在其中替换,如果它是锚元素则跳过它们。

【讨论】:

  • -1 这也将替换发布者明确表示他不想定位的锚点中的句点。
  • 是的,因此我对 OP 的说明。但是,我很好奇,为什么您不赞成这个,而不是另一个说完全相同的答案。
  • 无论如何,我认为部分答案(对问题的第一部分)至少会有些用处,因为 OP 似乎不知道如何进行全局替换。
  • 说真的。在我遭受 Darko Z 的愤怒之前,我会拿走我的答案。:p 你可以编辑你的答案以获得适当的 jquery 选择 Dav。
  • 听我说!严肃地说,虽然这应该可以通过一个好的正则表达式来实现。现在没有时间调查它,但也许以后会:)
猜你喜欢
  • 2017-06-03
  • 1970-01-01
  • 2020-05-17
  • 2021-10-18
  • 2016-02-03
  • 2015-05-22
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
相关资源
最近更新 更多