用于匹配标点符号的JavaScript RegEx不是任何HTML标记的一部分

时间:2012-11-23 16:48:53

标签: javascript html regex

好的,我知道在RegEx中匹配和解析HTML有很多争议,但我想知道我是否能得到一些帮助。 Case and Point.

我需要匹配任何标点字符,例如. , " ',但我不想破坏任何HTML,因此理想情况下它应该在><之间进行 - 基本上我的查询与解析HTML无关,就像避免它一样。

我将尝试在<span></span>中替换包装每个实例 - 但是在RegEx中完全没有经验,我不确定我是否能够这样做。

我已经找到了字符集[\.\,\'\"\?\!],但我不确定如何匹配仅在某些字符之间出现的字符集。有人可以帮忙吗?

3 个答案:

答案 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)

丹,恢复这个问题,因为它有一个简单的解决方案,没有提到。 (在为regex bounty quest进行一些研究时找到了您的问题。)

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 "&lt;span&gt;" + group1 + "&lt;/span&gt;";
});
document.write(replaced);
</script>

这里是live demo

参考

  1. How to match pattern except in situations s1, s2, s3
  2. How to match a pattern unless...