首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Regexp仅搜索/替换文本,而不是HTML属性中的文本

Regexp仅搜索/替换文本,而不是HTML属性中的文本
EN

Stack Overflow用户
提问于 2010-08-11 15:24:48
回答 5查看 3.5K关注 0票数 6

我正在使用JavaScript做一些正则表达式。考虑到我正在使用格式良好的源代码,并且我想删除之前的任何空间。并且只在,.之后保留一个空格。是一个数字的一部分。因此,我使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
text = text.replace(/ *(,|\.) *([^ 0-9])/g, '$1 $2');

问题是这也替换了html标签属性中的文本。例如,我的文本是(总是用标签包装):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>Test,and test . Again <img src="xyz.jpg"> ...</p>

现在它添加了一个像这样的src="xyz. jpg"空格,这是意想不到的。如何重写我的正则表达式?我想要的是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>Test, and test. Again <img src="xyz.jpg"> ...</p>

谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-08-11 22:40:24

您可以使用先行检查来确保匹配不会发生在标记中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
text = text.replace(/(?![^<>]*>) *([.,]) *([^ \d])/g, '$1 $2');

通常的警告适用于CDATA节、SGML注释、脚本元素和属性值中的尖括号。但我怀疑您的真正问题将来自“纯文本”的变幻莫测;HTML甚至无法与之匹敌。:D

票数 4
EN

Stack Overflow用户

发布于 2010-08-11 15:30:20

不要试图通过重写表达式来做到这一点。你不会成功,并且几乎肯定会忘记一些角落案例。在最好的情况下,这将导致严重的错误,而在最坏的情况下,您将引入安全问题。

相反,当您已经在使用JavaScript并且拥有格式良好的代码时,可以使用真正的XML解析器循环遍历文本节点,并且只对它们应用正则表达式。

票数 1
EN

Stack Overflow用户

发布于 2010-08-11 15:44:21

如果可以通过DOM访问文本,则可以执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function fixPunctuation(elem) {
    // check if parameter is a an ELEMENT_NODE
    if (!(elem instanceof Node) || elem.nodeType !== Node.ELEMENT_NODE) return;
    var children = elem.childNodes, node;
    // iterate the child nodes of the element node
    for (var i=0; children[i]; ++i) {
        node = children[i];
        // check the child’s node type
        switch (node.nodeType) {
        case Node.ELEMENT_NODE:
            // call fixPunctuation if it’s also an ELEMENT_NODE
            fixPunctuation(node);
            break;
        case Node.TEXT_NODE:
            // fix punctuation if it’s a TEXT_NODE
            node.nodeValue = node.nodeValue.replace(/ *(,|\.) *([^ 0-9])/g, '$1 $2');
            break;
        }
    }
}

现在只需将DOM节点传递给该函数,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fixPunctuation(document.body);
fixPunctuation(document.getElementById("foobar"));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3460004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文