Javascript 使用jQuery,如何只保留某些HTML的第一句话,并保留格式?

Javascript 使用jQuery,如何只保留某些HTML的第一句话,并保留格式?,javascript,jquery,html,strip,Javascript,Jquery,Html,Strip,假设我有一些HTML,如下所示: <div id="text">This <i>is</i> a <b>test</b>. Do <i>not</i> be <b>alarmed</b>.</div> 这是一个测试。不要惊慌。 我想用jQuery去掉第一句话,那就是这是一个测试。 我知道如何使用.text()去掉文本,然后使用.indexOf()找到第一个句点,这样我就知道

假设我有一些HTML,如下所示:

<div id="text">This <i>is</i> a <b>test</b>. Do <i>not</i> be <b>alarmed</b>.</div>
这是一个测试。不要惊慌。
我想用jQuery去掉第一句话,那就是
这是一个测试。

我知道如何使用
.text()
去掉文本,然后使用
.indexOf()
找到第一个句点,这样我就知道第一句话的结尾,但我不知道如何在保持HTML格式的同时做到这一切。现在,我有一个非常混乱的解决方案,它使用常规JavaScript循环遍历节点等等。然而,当我在
格式中有
链接时,事情开始变得有点混乱

$("#text").mouseover(function(event) {
   alert($(this).html().split(".")[0]+".");
});
也许我对你的理解有误,但可能就这么简单


也许我没有正确地理解你,但这可能很简单。

我正在创建一个新的答案,而不是评论,因为这是我自己问题的一个可能答案,我刚才在玩了一下后创建了这个问题。(正如我前面提到的,我以前的尝试没有涉及jQuery,也有太多的问题。)不过,我希望得到反馈,因为它可能会对特定情况进行一些调整。我使用HTML字符串而不是jQuery对象作为输入,因为我需要首先去除HTML中的
标记,我发现使用
更容易。替换
而不是循环每个节点来完成这项工作。我可能很快就会去修的

到目前为止,下面的代码工作得相当好。如果第一个句点位于标记(如
a test.
)内,它甚至会找到第一个句点,并相应地删除后续节点。但是,如果是
测试。Blah
然后它将保留
Blah
,因为下面的代码当前没有深入挖掘以正确删除
后面的文本,当它位于另一个节点内时

HTML:

这是一个测试。不要惊慌。
JavaScript:

$('#text').replaceWith(firstSentenceOnly($('#text').html().replace(/<(b|strong)>(.*?)<\/(b|strong)>/gi, '$2')));

function firstSentenceOnly(node)
{
    // Convert to jQuery object
    if (typeof(node) == 'string')
        node = $('<div>' + node + '</div>');

    var periodFound = false;

    node.contents().each(function()
    {
        if (periodFound == true)
        {
            $(this).remove();
        }
        else if ($(this).text().indexOf('.') != -1)
        {
            periodFound = true;

            if ($(this)[0].nodeValue && $(this)[0].nodeValue.indexOf('.') != -1)
            {
                $(this)[0].nodeValue = $(this)[0].nodeValue.substring(0, $(this)[0].nodeValue.indexOf('.') + 1);
            }
        }
    });

    return node;
}
$('#text').replaceWith(仅第一句($('#text').html().replace(/(.*)/gi,$2'));
函数firstSentenceOnly(节点)
{
//转换为jQuery对象
if(节点类型)=“字符串”)
节点=$(''+节点+'');
var=false;
node.contents().each(函数())
{
if(periodFound==true)
{
$(this.remove();
}
else if($(this).text().indexOf('.')!=-1)
{
周期发现=真;
if($(this)[0].nodeValue&&$(this)[0].nodeValue.indexOf('.')!=-1)
{
$(this)[0].nodeValue=$(this)[0].nodeValue.substring(0,$(this)[0].nodeValue.indexOf('.')+1);
}
}
});
返回节点;
}

我正在创建一个新的答案,而不是评论,因为这是我自己问题的一个可能的答案,我刚才在玩了一会儿之后创建了这个问题。(正如我前面提到的,我以前的尝试没有涉及jQuery,也有太多的问题。)不过,我希望得到反馈,因为它可能会对特定情况进行一些调整。我使用HTML字符串而不是jQuery对象作为输入,因为我需要首先去除HTML中的
标记,我发现使用
更容易。替换
而不是循环每个节点来完成这项工作。我可能很快就会去修的

到目前为止,下面的代码工作得相当好。如果第一个句点位于标记(如
a test.
)内,它甚至会找到第一个句点,并相应地删除后续节点。但是,如果是
测试。Blah
然后它将保留
Blah
,因为下面的代码当前没有深入挖掘以正确删除
后面的文本,当它位于另一个节点内时

HTML:

这是一个测试。不要惊慌。
JavaScript:

$('#text').replaceWith(firstSentenceOnly($('#text').html().replace(/<(b|strong)>(.*?)<\/(b|strong)>/gi, '$2')));

function firstSentenceOnly(node)
{
    // Convert to jQuery object
    if (typeof(node) == 'string')
        node = $('<div>' + node + '</div>');

    var periodFound = false;

    node.contents().each(function()
    {
        if (periodFound == true)
        {
            $(this).remove();
        }
        else if ($(this).text().indexOf('.') != -1)
        {
            periodFound = true;

            if ($(this)[0].nodeValue && $(this)[0].nodeValue.indexOf('.') != -1)
            {
                $(this)[0].nodeValue = $(this)[0].nodeValue.substring(0, $(this)[0].nodeValue.indexOf('.') + 1);
            }
        }
    });

    return node;
}
$('#text').replaceWith(仅第一句($('#text').html().replace(/(.*)/gi,$2'));
函数firstSentenceOnly(节点)
{
//转换为jQuery对象
if(节点类型)=“字符串”)
节点=$(''+节点+'');
var=false;
node.contents().each(函数())
{
if(periodFound==true)
{
$(this.remove();
}
else if($(this).text().indexOf('.')!=-1)
{
周期发现=真;
if($(this)[0].nodeValue&&$(this)[0].nodeValue.indexOf('.')!=-1)
{
$(this)[0].nodeValue=$(this)[0].nodeValue.substring(0,$(this)[0].nodeValue.indexOf('.')+1);
}
}
});
返回节点;
}

取决于源数据的格式。如果您无法预测源数据将是什么样子,我认为很难正确解析您的数据。我们可以看到您的“混乱”解决方案吗?@Eric,我在下面发布了一个可能的解决方案,其中包括jQuery作为“答案”。这取决于源数据的格式。如果您无法预测源数据将是什么样子,我认为很难正确解析您的数据。我们可以看到您的“混乱”解决方案吗?@Eric,我在下面发布了一个可能的解决方案,其中包括jQuery作为“答案”。如果有人决定在属性中添加句号,则不会!或者当文本中有数字或日期时。。。或者一个由三个点组成的省略号,而不是一个字符。是的,这就是问题所在。句点可以在属性中,尤其是在URL中有很多句点的链接。我在下面发布了一个可能的解决方案作为“答案”。如果有人决定在属性中添加句点,则不会!或者当文本中有数字或日期时。。。或者一个由三个点组成的省略号,而不是一个字符。是的,这就是问题所在。一个句号可以在一个属性中,特别是在URL中有很多句号的链接。我在下面发布了一个可能的解决方案作为“答案”。