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。:/但是谢谢!