Javascript 迭代每个元素,只获取直接位于节点中的内容

Javascript 迭代每个元素,只获取直接位于节点中的内容,javascript,php,jquery,phpquery,Javascript,Php,Jquery,Phpquery,假设我有这个代码 <p>FirstLevelP <span>SecondLevelSpan</span> </p> <p>FirstLevelP <span>SecondLevelSpan <p>ThirdLevelP</p> </span> </p> 但是我想要这样的 FirstelElement: FirstLevelP Secon

假设我有这个代码

<p>FirstLevelP
    <span>SecondLevelSpan</span>
</p>
<p>FirstLevelP
    <span>SecondLevelSpan
        <p>ThirdLevelP</p>
    </span>
</p>
但是我想要这样的

FirstelElement: FirstLevelP
SecondElement: SecondLevelSpan
ThirdElement: FirstLevelP
FourthElement: SecondLevelSpan
FifthElement: ThirdLevelP
<p>FirstLevelP.
    <span>SecondLevelSpan.</span>
</p>
<p>FirstLevelP.
    <span>SecondLevelSpan.
        <p>ThirdLevelP.</p>
    </span>
</p>
<p>FirstLevelP
    <span>SecondLevelSpan</span>.
</p>
<p>FirstLevelP
    <span>SecondLevelSpan
        <p>ThirdLevelP</p>
    </span>.
</p>
这可能吗

在我的研究中,我已经在这里找到了这个答案

$("#foo")
    .clone()    //clone the element
    .children() //select all the children
    .remove()   //remove all the children
    .end()  //again go back to selected element
    .text();
但这只能解决我一半的问题。我仍然需要修改原始内容中的文本!提前谢谢各位

编辑以进行澄清

所以基本上,我想要达到的目标是这样的:

foreach (pq($content)->filter(':header') as $headline) {
    if (substr(pq($headline)->text(), 0, -1) != '.') {
        $content = preg_replace('#(' . pq($headline) . ')#', pq($headline) . '.', pq($content));
    }
}
对于每个元素,我想检查是否在末尾有一个点。如果不是,我想添加一个。我已经设法在头条新闻中这样做了,比如:

foreach (pq($content)->filter(':header') as $headline) {
    if (substr(pq($headline)->text(), 0, -1) != '.') {
        $content = preg_replace('#(' . pq($headline) . ')#', pq($headline) . '.', pq($content));
    }
}
正如我所说的,问题是,当我有嵌套元素时,它会在整个元素之后添加点,而不是在每个子元素之后(如果必要的话)

要使用我的“假定”代码,它应该如下所示

FirstelElement: FirstLevelP
SecondElement: SecondLevelSpan
ThirdElement: FirstLevelP
FourthElement: SecondLevelSpan
FifthElement: ThirdLevelP
<p>FirstLevelP.
    <span>SecondLevelSpan.</span>
</p>
<p>FirstLevelP.
    <span>SecondLevelSpan.
        <p>ThirdLevelP.</p>
    </span>
</p>
<p>FirstLevelP
    <span>SecondLevelSpan</span>.
</p>
<p>FirstLevelP
    <span>SecondLevelSpan
        <p>ThirdLevelP</p>
    </span>.
</p>
FirstLevelP。
第二级跨度。

第一级。 第二级跨度。 第三层

但不幸的是,现在看起来是这样的

FirstelElement: FirstLevelP
SecondElement: SecondLevelSpan
ThirdElement: FirstLevelP
FourthElement: SecondLevelSpan
FifthElement: ThirdLevelP
<p>FirstLevelP.
    <span>SecondLevelSpan.</span>
</p>
<p>FirstLevelP.
    <span>SecondLevelSpan.
        <p>ThirdLevelP.</p>
    </span>
</p>
<p>FirstLevelP
    <span>SecondLevelSpan</span>.
</p>
<p>FirstLevelP
    <span>SecondLevelSpan
        <p>ThirdLevelP</p>
    </span>.
</p>
FirstLevelP
第二级跨度。

一级 二级跨度 第三层

.


注意点。

查找和更改没有子元素的文本的方法如下:

// search every element
    $("body *").each(function(index, el) {
        // find first text node
        var node = $(el).contents().filter(function() {
            return this.nodeType === 3;
        })[0];

        // change text
        node.textContent = "new text";
    });
编辑,更新

试一试

$(“body*”)。每个(函数(i,el){
如果($(el).is(“p,span”)){
$(el).text(函数(idx,text){
var t=text.split(“\n”)[0];
返回t.slice(-1)!==“?t+”:t
})
}
})

一级
二级跨度

一级 二级跨度 第三层


“这只解决了我一半的问题。我仍然需要修改原始内容中的文本!”-您是否愿意与我们分享您的实际问题,以便我们可以尝试提供帮助,而不必猜测您最终要实现的目标?嗨,大卫,我已经用一些新的方法更新了这个问题clarification@Musterknabe见下文。谢谢你的回答。你知道PHP是否也可以做到这一点吗?我尝试了这个foreach(pq($content)作为$value){$node=pq($value)->contents()->filter(function($nd){return$nd->nodeType==3;})[0];print$node.'
';}但它实际上不起作用。有什么想法吗?这适用于JS(试用过),但不适用于PHP。:/但是谢谢!