我正在使用JavaScript做一些正则表达式。考虑到我正在使用格式良好的源代码,并且我想删除之前的任何空间。并且只在,.之后保留一个空格。是一个数字的一部分。因此,我使用:
text = text.replace(/ *(,|\.) *([^ 0-9])/g, '$1 $2');
问题是这也替换了html标签属性中的文本。例如,我的文本是(总是用标签包装):
<p>Test,and test . Again <img src="xyz.jpg"> ...</p>
现在它添加了一个像这样的src="xyz. jpg"
空格,这是意想不到的。如何重写我的正则表达式?我想要的是
<p>Test, and test. Again <img src="xyz.jpg"> ...</p>
谢谢!
发布于 2010-08-11 22:40:24
您可以使用先行检查来确保匹配不会发生在标记中:
text = text.replace(/(?![^<>]*>) *([.,]) *([^ \d])/g, '$1 $2');
通常的警告适用于CDATA节、SGML注释、脚本元素和属性值中的尖括号。但我怀疑您的真正问题将来自“纯文本”的变幻莫测;HTML甚至无法与之匹敌。:D
发布于 2010-08-11 15:30:20
不要试图通过重写表达式来做到这一点。你不会成功,并且几乎肯定会忘记一些角落案例。在最好的情况下,这将导致严重的错误,而在最坏的情况下,您将引入安全问题。
相反,当您已经在使用JavaScript并且拥有格式良好的代码时,可以使用真正的XML解析器循环遍历文本节点,并且只对它们应用正则表达式。
发布于 2010-08-11 15:44:21
如果可以通过DOM访问文本,则可以执行以下操作:
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节点传递给该函数,如下所示:
fixPunctuation(document.body);
fixPunctuation(document.getElementById("foobar"));
https://stackoverflow.com/questions/3460004
复制相似问题