0

如果我们在做 jQuery,这只是一件小事,只需标记 TR 并将其删除等。但我很好奇如何以严格的正则表达式方式做到这一点.. 操纵 dom。

我有这个:

<tr id="anyName">
    <td>
         // a bunch of html
    </td>
</tr>

您将如何使用正则表达式将该 tr 及其中的所有内容替换为“”。

我有这个:

sometable.replace(".*?","");

我尝试了其他一些事情,但我无法让它工作。基本上,我希望 tr 及其所有内容消失。我正在使用服务器端模板引擎,该引擎在进入视图之前处理所有这些数据。所以,我可以将这些数据作为字符串保存到这个模板逻辑中......然后删除它......但由于它是一个字符串,我需要正则表达式来删除它。

有任何想法吗?我觉得我在这里遗漏了一些非常简单的东西。

4

2 回答 2

4

问题是里面<tr>可以有嵌套<tr>标签..

在某些情况下,<tr>标签没有结束标签(XHTML 除外)

因此,即使您在正则表达式中使用奇数模式,正则表达式也无法删除此类标签

所以,请不要为此使用正则表达式


由于您使用的是 jquery,因此您可以使用remove

$('tr').remove();

或者您可以使用其他一些服务器端 html 解析器..但不要使用正则表达式..它可能会破坏您的网站


要回答您的问题,您可以使用此正则表达式

 (?s)<tr[^<>]*>(.(?!<tr[^<>]*>))*?</tr>

或在javascript中

 /<tr[^<>]*>(.(?!<tr[^<>]*>))*?<\/tr>/s

演示

但是等等。你需要不断地替换它,直到它替换所有的内容

因此,您需要使用for 循环和循环,直到它替换所有 ..

但是这个正则表达式可能会中断,因为没有结束标签

于 2013-07-02T03:07:20.497 回答
0

@Anirudh 是正确的;由于嵌套<tr>标签和未闭合<tr>标签,这可能是一个非常困难的问题。但是假设你没有嵌套或未闭合的<tr>标签,你确实可以使用正则表达式来解决这个问题。

// if your html is in a variable called "html", you can get rid of <tr> tags thusly:
html = html.replace( /<tr[^]*?<\/tr>/, '' );

请注意,我们不能.*在开始和结束<tr>标签之间使用。为什么?因为.通配符不匹配换行符,所以[^]. 另请注意,我们不会尝试匹配开始<tr>标记中的右尖括号,因为标记中可能存在属性。

如果您的 HTML 格式正确,则标签之间不能有任何内容(除了注释)<tr>。但是,如果您确实想保留这些注释,则必须小心(养成一般思考的习惯是一件好事):如果您使用默认的贪婪*量词,它会从一开始就吞噬所有内容开始<tr>标签到最后一个结束标签,包括注释和标签之间的任何无效代码<tr>。要解决此问题,请通过附加 . 使量词变得惰性?

在此处查看我的解决方案(在 JavaScript 中,没有jQuery):

http://jsfiddle.net/TpeEj/2/

于 2013-07-02T03:30:47.107 回答