我的文字段落可能是这样的:
<p>
<span style='font-family:arial'>
Some text
</span>
</p>
或
<p>
<strong>
Some more text
<strong>
</p>
或
<p>
<strong>
<em>
Yet more text
</em>
</strong>
</p>
然而,有很多嵌套标签,我只能使用$('p').text()
来获取文本。问题是当<br>
弹出中间时。在这种情况下,文本所处的任何标记都会被分解。例如,这个:
<p>
<strong>
Some more text
</strong>
</p>
将变为:
<p>
<strong>
Some
</strong>
<br />
<strong>
more text
</strong>
</p>
所以你看,<strong>
标签中有2个文本节点,而不只是一个。我想要做的是仅使用原始父标记获取文本,将<br>
视为另一个文本节点,但没有<br>
- 诱导标记 - 拆分入侵。例如,给定上面的2节点HTML,我只想要一个返回此函数的函数:
<p>
<strong>
Some
<br />
more text
</strong>
</p>
对于一些给定格式,这样会很好,但我需要保留不同类型的HTML嵌套(例如<p><strong><em>
或<p><em><strong>
或<p><strong><span>
等等。
我认为最简单的方法是获取$('p').html()
并简单地删除<br>
周围的所有标签,而不是迷失在循环中?在<br>
的左边是关闭标签,在右边有开口标签。那会有正则表达式解决方案吗?
答案 0 :(得分:2)
<br>
<p>
<br>
元素,比较前一个和后一个元素的名称<br>
和以下元素的内容移到前一个元素中此:
$("p").clone().find("br").each(function() {
var $this = $(this), $prev = $this.prev(), $next = $this.next();
if ( $prev.length && $prev.prop("nodeName") === $next.prop("nodeName") ) {
$prev.append( $this, $next.contents() );
$next.remove();
}
}).end().each(function () {
console.log( $(this).html() );
});
(请注意,我使用clone()
来避免修改原文。)
适用于
<p>
<strong>
Some
</strong>
<br />
<strong>
more text
</strong>
</p>
将此内容写入控制台
<strong>
Some
<br>
more text
</strong>
http://jsfiddle.net/Tomalak/y3hSp/
这是一种迭代方法,以jQuery插件的形式折叠由<br>
分隔的相邻节点:
$.fn.extend({
collapseBreaks: function () {
return this.each(function () {
var done = false;
while (!done) {
done = true;
$(this).find("br").each(function() {
var $this = $(this),
$prev = $this.prev(),
$next = $this.next();
if (
$prev.length
&& $prev.prop("nodeName") === $next.prop("nodeName")
) {
$prev.append( $this, $next.contents() );
$next.remove();
done = false;
}
});
}
});
}
});
用作
$("p").collapseBreaks();
答案 1 :(得分:1)
那么,那么:
var innerString = thatPFromYourQuestion.innerHTML;
innerString = innerString.replace("<.*>", "");
那应该用空字符串替换每个标记,返回所有文本。
我想我误解了你的问题。如果您只是想要从字面上理解该段落中的内容,那么.innerHTML
就会做到这一点。如果您希望<BR />
被切断,则应使用replace()
来电略有不同的版本:
innerString = innerString.replace("<br>", "");