2

好的,我知道在 RegEx 中匹配和解析 HTML 存在很多争议,但我想知道是否可以提供一些帮助。案例和观点。

我需要匹配任何标点符号,例如. , " ',但我不想破坏任何 HTML,所以理想情况下它应该出现在 a>和 a之间<- 基本上我的查询与其说是解析 HTML,不如说是避免它。

我将尝试替换将每个实例包装在一个<span></span>- 但在 RegEx 方面绝对没有经验,我不确定我是否能够做到。

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

4

3 回答 3

2

首先,这是一个 X-browser 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]并替换内容来引用节点。
请注意,不建议循环遍历所有元素,但我真的不想为您完成所有工作;-)。您必须检查您正在处理的节点类型:

if (allTags[i].tagName.toLowerCase() === 'span')
{//do certain things
}
if (allTags[i].tagName.toLowerCase() === 'html')
{//skip
    continue;
}    

还有那种东西......
请注意,此代码未经测试,但它是我对上一个问题的回答的简化版本。解析器位应该可以正常工作,实际上这是我为另一个问题设置的小提琴,它还向您展示了您可能希望如何更改此代码以更好地满足您的需求

于 2012-11-23T17:15:15.707 回答
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,并使用 regex 搜索结果[,."']

于 2012-11-23T17:11:31.207 回答
0

丹,重新提出这个问题,因为它有一个没有提到的简单解决方案。(在对正则表达式赏金任务进行一些研究时发现了您的问题。)

Dom 解析器解决方案很棒。有了所有关于使用正则表达式解析 html 的免责声明,我想添加一个简单的方法来在 Javascript 中使用正则表达式来做你想做的事情。

正则表达式非常简单:

<[^>]*>|([.,"'])

交替的左侧匹配完整的标签。我们将忽略这些匹配。右侧匹配并捕获第 1 组的标点符号,我们知道它们是正确的标点符号,因为它们与左侧的表达式不匹配。

此演示中,查看右下窗格,您可以看到只有正确的标点符号被捕获到第 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>

这是一个现场演示

参考

  1. 除了情况 s1、s2、s3 之外,如何匹配模式
  2. 如何匹配模式,除非...
于 2014-05-15T01:11:28.223 回答