好的,我知道在RegEx中匹配和解析HTML有很多争议,但我想知道我是否能得到一些帮助。 Case and Point.
我需要匹配任何标点字符,例如. , " '
,但我不想破坏任何HTML,因此理想情况下它应该在>
和<
之间进行 - 基本上我的查询与解析HTML无关,就像避免它一样。
我将尝试在<span></span>
中替换包装每个实例 - 但是在RegEx中完全没有经验,我不确定我是否能够这样做。
我已经找到了字符集[\.\,\'\"\?\!]
,但我不确定如何匹配仅在某些字符之间出现的字符集。有人可以帮忙吗?
答案 0 :(得分:2)
首先,这是一个X浏览器dom-parser函数:
var parseXML = (function(w,undefined)
{
'use strict';
var parser,ie = false;
switch (true)
{
case w.DOMParser !== undefined:
parser = new w.DOMParser();
break;
case new w.ActiveXObject("Microsoft.XMLDOM") !== undefined:
parser = new w.ActiveXObject("Microsoft.XMLDOM");
parser.async = false;
ie = true;
break;
default :
throw new Error('No parser found');
}
return function(xmlString)
{
if (ie === true)
{//return DOM
parser.loadXML(xmlString);
return parser;
}
return parser.parseFromString(xmlString,'text/xml');
};
})(this);
//usage:
var newDom = parseXML(yourString);
var allTags = newDom.getElementsByTagName('*');
for(var i=0;i<allTags.length;i++)
{
if (allTags[i].tagName.toLowerCase() === 'span')
{//if all you want to work with are the spans:
if (allTags[i].hasChildNodes())
{
//this span has nodes inside, don't apply regex:
continue;
}
allTags[i].innerHTML = allTags[i].innerHTML.replace(/[.,?!'"]+/g,'');
}
}
这应该会帮助你。您仍然可以访问DOM,因此每当您找到需要过滤/替换的字符串时,您可以使用allTags[i]
引用该节点并替换内容。
请注意循环 all 元素不被推荐,但我真的不想为你做所有的工作;-)。您必须检查您正在处理的节点类型:
if (allTags[i].tagName.toLowerCase() === 'span')
{//do certain things
}
if (allTags[i].tagName.toLowerCase() === 'html')
{//skip
continue;
}
那种东西......
请注意,此代码未经过测试,但它是我对上一个问题的答案的简化版本。解析器位应该可以正常工作,事实上here's a fiddle我已经设置了另一个问题,它还向您展示了如何更改此代码以更好地满足您的需求
答案 1 :(得分:1)
编辑正如Elias指出的那样,原生JScript不支持前瞻。我会留下这个以防其他人寻找类似的东西,只是要注意。
这是我开始工作的正则表达式,它需要前瞻和外观,我对Javascript不够熟悉,不知道是否支持。无论哪种方式,这里是正则表达式:
(?<=>.*?)[,."'](?=.*<)
故障:
1. (?<=>.*?) --> The match(es) must have ">" followed by any characters
2. [,."'] --> Matches for the characters: , . " '
3. (?=.*<) --> The match(es) must have any characters then "<" before it
这实际上意味着它将匹配您在一组> <
之间所需的任何字符。
话虽如此,我建议在评论中提到使用专为此设计的工具解析HTML,并使用正则表达式[,."']
搜索结果。
答案 2 :(得分:0)
Dom解析器解决方案很棒。关于使用正则表达式来解析html的所有免责声明,我想添加一种简单的方法来使用Javascript中的正则表达式来执行您想要的操作。
正则表达式非常简单:
<[^>]*>|([.,"'])
交替的左侧与完整标签匹配。我们将忽略这些匹配。右侧匹配并捕获到第1组的标点符号,我们知道它们是正确的标点符号,因为它们与左侧的表达式不匹配。
在this demo上,查看右下方的窗格,您可以看到只有正确的标点符号被捕获到第1组。
你说你想在<span>
中嵌入标点符号。这个Javascript代码会做到这一点。
我已将<tags>
替换为{tags}
,以确保示例显示在浏览器中。
<script>
var subject = 'true ,she said. {tag \" . ,}';
var regex = /{[^}]*}|([.,"'])/g;
replaced = subject.replace(regex, function(m, group1) {
if (group1 == "" ) return m;
else return "<span>" + group1 + "</span>";
});
document.write(replaced);
</script>
这里是live demo
参考