从字符串列表中删除所有html标记,除了第一个
Remove all html tags from string by list, except the first one
我有一串html标签和一个禁用标签列表:在forbiddenTags中找到的任何标签都应该从str中删除,除了第一个。
也许可以通过循环字符串
来完成我试了下一件事:
var forbiddenTags = ["div", "city"];
var str = '<?xml version="1.0" encoding="UTF-8"?>' +
'<ADDUMP>' +
' <HEADER>' +
' <div></div>' +
' <div>Help Wanted Line</div>' +
' </HEADER>' +
' <ADINFO>' +
' <CUSTOMER>' +
' <CITY></CITY>' +
' <Div></DIV>' +
' <STATE></STATE>' +
' </CUSTOMER>' +
' </ADINFO>' +
'</ADDUMP>' +
'</xml>';
var arrayLength = forbiddenTags.length;
for (var i = 0; i < arrayLength; i++) {
// remove all forbiddenTags (upper and lower case)
var re = new RegExp("</? *" + forbiddenTags[i] + "[^>]*>","gi");
str = str.replace(re, "");
}
console.log(str);
不幸的是,有两个问题:
1)它还删除forbiddenTags中找到的字符串的第一个标签。
2)它不删除标签的内容。
的例子:
<div>hi</div>
<div>how</div>
<div></div>
应:<div>hi</div>
这是我的jsfield:http://jsfiddle.net/Ht6Ym/3469/
感谢任何帮助!
要匹配标记的内容和标记本身,您需要更改正则表达式以同时查找开始和结束标记。目前,它只检查一个或另一个,这就是为什么标签内容被留下。
这个正则表达式查找一个开始标记(和任何相关的属性),匹配的结束标记,以及任何中间的文本:
new RegExp("<(" + forbiddenTags[i] + ")[^>]*>(.*?)</''1>", "gi")
您的另一个问题(不想删除第一个匹配)可以通过将匿名函数作为参数传递给str.replace
来解决。在该函数中,使用计数器变量来确定何时删除匹配项。
for
循环。如果你只想保持第一个禁止标签发现整体,初始化它在你的for
循环(这是不清楚你想从你的问题)。然后将str = str.replace(re, "");
替换为:
str = str.replace(re, function(matchedText){
if (++counter>1){
return "";
} else {
return matchedText;
}
});
此函数针对每个匹配项运行。如果它是第一个匹配项,它只返回该匹配项(实际上,不处理它)。否则,它将删除它。
现在,所有这些使循环看起来像这样:
for (var i = 0; i < forbiddenTags.length; i++) {
var counter=0
var re = new RegExp("<(" + forbiddenTags[i] + ")[^>]*>(.*?)</''1>", "gi");
str = str.replace(re, function(matchedText){
if (++counter>1){
return "";
} else {
return matchedText;
}
});
}
如果可以选择使用jQuery,可以使用下面的函数使事情看起来更整洁(即删除讨厌的正则表达式):
var removeElements = function(text, selector) {
var wrapped = $("<div>" + text + "</div>");
wrapped.find(selector+":not(:first)").remove();
return wrapped.html();
}
for (var i = 0; i < forbiddenTags.length; i++) {
str = removeElements(str, forbiddenTags[i]);
}
使用str.match
获取所有匹配项并丢弃除第一个之外的所有匹配项
似乎Rob W在这篇文章上的答案是你正在寻找的。所有你需要改变的是first = true
到first = {}
,并检查
if (!first[tag]) {
first[tag] = true;
} else {
return '';
}
相关文章:
- 而循环只设置php中输入字段中的第一个值
- 错误:$injector:modulerr模块错误(我的第一个SPA应用程序)
- IE11中的第二个调用取消了第一个Fetch API调用
- Javascript XMLHttpRequest——只有第一个POST请求有效
- 使用javascript或angularjs特定过滤器搜索字符串中第一个img标记的json值
- 在文本上方标记另一个文本
- 将OnClick函数设置为<ul>,最后一个ul是擦除第一个ul-s
- RxJS油门行为;立即获取第一个值
- Angular UI网格:如何通过第一个UI网格中的按钮使第二个UI网格可见
- 选择多个实例中的第一个
- 如何在调用下一个请求之前完成第一个Ajax Get请求
- Lodash:返回对象的第一个键,该对象的值(即数组)中有一个给定的元素(即字符串)
- 看起来第一个console.log是'It’不太对
- 与杜兰达尔合作的第一个JavaScript项目.尝试从第三方 API 获取数据
- 使用 javascript 和正则表达式删除 HTML 字符串中的第一个 img 标记
- 提取第一个url参数,然后将其放入脚本标记中
- 如何在第一个<br>标记在<h1>
- 使用脚本查找文本字符串,直到第一个html标记
- 从字符串列表中删除所有html标记,除了第一个
- 避免使用jquery多次选择相同的选项,第一个select标记除外