查找两个标记/节点之间的文本
Find text between two tags/nodes
我原以为这会很简单,但我认为关键字太笼统了,所以我一直在获取这类和这类的查询结果。
基本上,我有以下HTML:
<div id="test">
Lorem
<span class="highlighted">ipsum</span>
dolor sit amet,
<span class="highlighted">consectetur</span>
<span class="highlighted">adipiscing</span>
elit. Sed massa.
<div>
我想将相邻的span标记合并为一个span标记,这意味着要查找它们之间只有空白的span(这可能包括空格、制表符和换行符)。
我正在寻找的结果是:
<div id="test">
Lorem
<span class="highlighted">ipsum</span>
dolor sit amet,
<span class="highlighted">consectetur adipiscing</span>
elit. Sed massa.
<div>
我已经检查了nextUntil
函数,但它似乎只返回标记,而不返回文本。例如,的结果
$("span.highlighted").nextUntil("span.highlighted").andSelf().text();
是
ipsumconsecteturadiscing
而不是
ipsum悲哀坐amet,consecteturadiiscing
给定两个标签,如何在之间找到文本?
当检查同级时,可以通过下拉到DOM来查看文本节点内容。
类似于:
function combineSpans(span, nextspan)
{
var follower = span.nextSibling;
var concat = true;
while (follower != nextspan)
{
if (follower.nodeName != '#text')
{
concat = false;
break;
}
var len = follower.data.trim().length;
if (len > 0)
{
concat = false;
break;
}
follower = follower.nextSibling;
}
if (concat)
{
$(span).text($(span).text() + " " + $(follower).text());
$(follower).remove();
}
}
在此CodePen中将其与HTML一起使用。
好吧,你可以试试这个。。。
至少,当使用2spans
像您的示例一样合并它们时(当存在"空"元素时),它非常完美。否则,您需要稍微考虑一下如何处理持续的span
。
(要查看我所说的内容,只需查看最后一行的注释:nextElem.remove()
并查看新的div
html)。
现场演示:http://jsfiddle.net/oscarj24/t45MR/
HTML:
<div id="test">
Lorem
<span class="highlighted">ipsum</span>
dolor sit amet,
<span class="highlighted">consectetur</span>
<span class="highlighted">adipiscing</span>
elit. Sed massa.
</div>
jQuery:
$(document).ready(function () {
var elem = $('#test');
elem.contents().filter(function(index) {
//Get index of an empty element
if($.trim($(this).text()) === '')
//Merge the previous index span with the next index span texts
mergeSpan(index);
});
//Print new inner html
alert(elem.html());
});
function mergeSpan(index){
//Get all 'div' elements
var elems = $('#test').contents();
//Get previous and next element according to index
var prevElem = elems.eq(index - 1);
var nextElem = elems.eq(index + 1);
//Concat both texts
var concatText = prevElem.text() + ' ' + nextElem.text();
//Set the new text in the first span
prevElem.text(concatText);
//Remove other span that lasts
nextElem.remove();
};
结果:
<div id="test">
Lorem
<span class="highlighted">ipsum</span>
dolor sit amet,
<span class="highlighted">consectetur adipiscing</span>
elit. Sed massa.
<div>
我知道您已经接受了一个解决方案,但我想接受挑战,提供一个可以集成到您的工具集中的纯javascript解决方案。以下是我的想法,希望得到任何帮助,让这一切变得更好。
http://jsfiddle.net/ryanwheale/JhZPK/
function joinNeighborsByClassName( className ) {
var items = document.getElementsByClassName(className),
next = null,
remove = [],
append = '',
i = 0;
while( i < items.length && (next = items[i++]) ) {
while( (next = next.nextSibling) && next !== null ) {
if((next.nodeType === 3 && /^'s+$/.test(next.nodeValue)) ||
(new RegExp("(?:^|'s)" + className + "(?!'S)", "g")).test(next.className) ) {
append += (next.innerHTML || next.nodeValue);
if(next.nodeType !== 3) {
remove.push(next);
}
} else {
break;
}
}
if(append) items[i-1].innerHTML += append;
for(var n = 0; n < remove.length; n++) {
remove[n].parentNode.removeChild(remove[n]);
}
remove = [];
append = '';
}
}
joinNeighborsByClassName('highlighted');
对于您的最后一个问题"给定两个标签,我如何找到它们之间的文本?"
好吧,我有这个解决方案给你。
var divData = $("#test").html(); // Getting html code inside div
现在,使用preg_match(),您可以获得两个单词之间的文本,在您的情况下是跨度之间的文本
preg_match('/'.preg_quote($word1).'(.*?)'.preg_quote($word2).'/is', $html, $matches);
$word1 = '<span class="highlighted">';
$word2 = '<';
$html = $_POST['divData']; // Via post/get you will have to send the html code gotten in "var divData"
并且对于每个匹配(使用for循环),在变量中插入em,在它们之间添加空白。然后回显结果,并在回调函数中将其添加到div 中
此链接可以帮助您了解如何在jquery jquery POST 中进行POST调用
根据标题的要求,这里有一种在跨度之间获取文本节点的可能方法:
var textNodes=$('#test').contents().filter(function(){
return this.nodeType == 3; // text node
});
也可以通过将每个节点与前一个节点进行比较来手动检查是否存在连续的跨度,这些跨度之间没有空文本节点。像这样的东西会起作用:
function combineSpansIn(selector, spanClass) {
// initialize precedent values
var prec=null;
var precNodeType;
$(selector).contents().each(function(){
if ($.trim( $(this).text() ) !== "") { // empty nodes will be useless here
var nodeType = this.nodeType;
// check if still a combinable span
if (nodeType == 1 && this.className==spanClass && nodeType == precNodeType) {
// append current node to precedent one
$(prec).append(" "+ $(this).text() );
// remove current node
$(this).remove();
} else {
// update precedent values
prec=this;
precNodeType = nodeType;
}
}
});
}
combineSpansIn('#test', 'highlighted');
请看一下这个FIDDLE。
嘿。看起来Oscar Jara和我在使用JQuery .contents()
方法时提出了类似的想法,但最终得到了一些截然不同的实现:
$(document).ready(function () {
$("#testDiv").contents().each(function() {
var prevNode = this.previousSibling;
var fillerText = "";
while ((prevNode) && ($.trim($(prevNode).text()) === "")) {
fillerText += prevNode.nodeValue;
prevNode = prevNode.previousSibling;
}
if ((prevNode) && (this.nodeType === 1) && (prevNode.nodeType === 1)) {
$(prevNode).text($(prevNode).text() + fillerText + $(this).text());
$(this).remove();
}
});
});
我测试了几个不同的HTML数据集(背靠背的三个跨度,中间有空格和没有空格的跨度,等等),所有这些都基于您的原始代码,它似乎可以工作。关键是跳过<span>
标签之间的任何"仅空白"文本节点,同时保留它们可能包含的任何所需间距。
- 绘制的节点和Google图表/可视化中的数据节点之间的关系
- D3Javascript中的力定向图中节点之间的链接
- 如何通过在两个节点之间拖放来制作边缘,并在细胞空间中扩展 egdehandle 扩展.js
- 在强制布局 D3.js 中保持节点之间的动态链接距离
- D3 力布局:如何保持节点之间的给定最小距离
- D3:对两个节点之间的圆进行动画处理
- d3:计算两个节点之间的线的中点,画一条从它到一个新节点成90度角的线
- PHP在HTML节点之间获取文本
- 如何在Cytoscape JS中添加两个节点之间的多个偏移边
- 查找两个标记/节点之间的文本
- 如何在CYTOSCAPE JS中突出显示两个节点之间的路径
- 如何找到两个抽象节点之间的路径?
- tree. nodesize()不能在D3树图中包含节点之间的空间
- jquery DOM两个节点之间的距离
- 使用cytoscape.js如何同时显示节点之间的箭头和自定义标签
- 节点之间的区别是什么?nextSibling和ChildNode.nextElementSibling
- 指定infoVis JIT图中节点之间的最小距离
- 在多个节点之间查找成本最小的路径
- 理解对象的问题(获取母子节点之间的年龄差)
- 在cytoscape.js中显示节点之间的关系