2011-10-04 80 views
0

我已经改变了我的代码,所以现在可以说有这样的:如何过滤@后跟“a”元素...以及以下<br>元素?

<p> 
    <a href="#">@Mr. Jingles</a> 
<br> 
<br> 
This would be where the person would say something.  // I want to start here 
<br> 
<br> 
This is even more text. 
</p> 
<p> 
    <a href="#">@Lady Ladington</a> 
<br> 
<br> 
Hello! 
</p> 

我想要做的就是删除第一<a>元素,然后删除所有<br>元素,直到那里的人会说什么。

如果成功,它应该看起来像:

<p> 
This would be where the person would say something. 
<br> 
<br> 
This is even more text. 
</p> 
<p> 
Hello! 
</p> 

注:这些会有人评论博客文章。

回答

0

假设它包裹在一个元件与“theContent”的ID:

var content = document.getElementById('theContent'); 
var c = content.innerHTML; 
c = c.replace(/@<a([^\/])+\/a>/,''); 
c = c.replace(/(\<br>(\s)+)+/,''); 
content.innerHTML = c; 
1

我只能认为在<p></p>的文字属性使用正则表达式的。

function remove (elem, name) { 
    var content = elem.innerHTML, 
     regex = new RegExp('@<a.*?>' + name + '<\/a>(\n)*(<br\s?\/?>|\n)*', 'mgi'); 
    elem.innerHTML = content.replace(regex, ''); 
} 

remove(paragr, 'Wiki Tiki'); 

你应该对正则表达式也许可以工作,以处理所有的场景,你可以得到换行符\n和/或XHTML休息<br />

问题是,这将是一个有点慢,因为的内部HTML操作,但试试看,也许它会足够快。

+0

希望这可以做到。 ''] +?> @'+ name + ...' – guzart

+0
0

这可能已经考虑到一些更多的检查,但它可能是这样的:

$('p') 
    .children().filter(function() { 
     return this.nodeType == Node.TEXT_NODE && $(this).text() == '@'; 
    }) 
    .next('a') 
    .nextUntil(':not(br)') 
    .andSelf() 
    .andSelf() 
    .remove(); 

而且,这不会在IE7和更早。用于this.nodeType == 3

0

你可以做这样的事情,我不知道它将如何高效是,你可能要改变逻辑根据包含在你的页面中的文本 -

$("p").contents().each(function() { 
    if (this.nodeType == 3 && this.nodeValue.indexOf("This would be") > -1) return false; 
    $(this).remove() 
}) 

的代码只是删除所有节点,直到它找到文本节点,并在其中包含“This would be”。

演示 - http://jsfiddle.net/ipr101/TTuDw/3/