正则表达式只搜索/替换文本,而不是在 HTML 属性中

jci*_*sio 5 html javascript regex

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

text = text.replace(/ *(,|\.) *([^ 0-9])/g, '$1 $2');
Run Code Online (Sandbox Code Playgroud)

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

<p>Test,and test . Again <img src="xyz.jpg"> ...</p>
Run Code Online (Sandbox Code Playgroud)

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

<p>Test, and test. Again <img src="xyz.jpg"> ...</p>
Run Code Online (Sandbox Code Playgroud)

谢谢!

Ala*_*ore 4

您可以使用前瞻来确保匹配不会发生在标记内:

text = text.replace(/(?![^<>]*>) *([.,]) *([^ \d])/g, '$1 $2');
Run Code Online (Sandbox Code Playgroud)

通常的警告适用于属性值中的 CDATA 部分、SGML 注释、SCRIPT 元素和尖括号。但我怀疑你真正的问题将源于“纯”文本的变幻莫测;HTML 甚至不属于同一联盟。:D