JavaScript正则表达式替换所有的<br/>标签

5
我正在尝试替换任何出现在</h2>标签之后的<br />标签。这是我目前的代码:
Text = Text.replace(new RegExp("</h2>(\<br \/\>.+)(.+?)", "g"), '</h2>$2');

似乎不起作用,有人能帮忙吗?(没有找到匹配项)。

测试案例:

<h2>Testing</h2><br /><br /><br />Text

致:

<h2>Testing</h2>Text

4
主啊,请使用解析器。 - Matt Ball
1
就好像你在求我发布这个问题的链接:https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454 - Gabe Moothart
@Gabe,我不知道怎么做,这是我正在编写的所见即所得编辑器,它将\n转换为<br />,将##title##转换为<h2>Title</h2>,但现在我只想删除所有h2后面的尾随<br />,否则看起来很糟糕。 - Tom Gullen
1
如果有可用的解析器库,建议使用。甚至最好只是编写一个快速简单的逐字符解析器。这实际上比正则表达式更容易理解、更令人满意、更容易理解和更少出错。当需要时,您可以轻松添加更多功能。我的经验法则是:正则表达式:它只比标记高一两个级别。您可以使用正则表达式验证单个HTML元素或文本节点。我认为那是表达式级别。但不是结构化的HTML。毫无疑问,有人会想出一个非常聪明的正则表达式来解决您的问题。 - rohannes
@Rohannes,我认为正则表达式更好,因为一旦表单提交,数据必须在服务器端进行处理以产生相同的输出,因此通过维护正则表达式可以更容易地实现这一点。 - Tom Gullen
4个回答

16

这比你想象的要简单:

Text = Text.replace(new RegExp("</h2>(\<br \/\>)*", "g"), "</h2>");

你不应该在实例中使用大写字母作为首字母。这通常是为类名保留的。 - Samuel Dauzon

5
如果您已经使用jQuery,则可以安全地执行此操作,而无需使用正则表达式:
var $dirty = $('<div>').append('<p>Where is<br>pancakes</p><h2>house?</h2><br><br>');
$dirty.find('h2 ~ br').remove();
var clean = $dirty.html();
// clean is now "<p>Where is<br>pancakes</p><h2>house?</h2>"

这也将防止 <br><br/><br /><BR> 等之间的差异。

谢谢,我认为使用正则表达式更好,因为当表单实际提交时,我必须在C#服务器端复制所有这些规则。 - Tom Gullen
@Tom:我建议你在服务器端使用HTML解析器(包括元素和属性白名单),即使你正在进行客户端清理,甚至如果你完全信任你的用户,你也应该完全清理来自客户端的所有内容。另一方面,这是你的项目,不是我的 :) - mu is too short

5
这将会实现你所要求的功能:
Text = Text.replace(new RegExp("</h2>(<br />)*", "g"), '</h2>');

3
你可以使用简写的正则表达式语法,使这个更加美观。
Text = Text.replace(/<\/h2>(<br\s*\/>)*/g, '</h2>');

2
我会将 * 更改为 +。否则,在没有任何 <br/> 标签的情况下,您将不必要地替换 </h2></h2> - ridgerunner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接