最好的办法是使用innerText 或textContent 获取没有标签的文本,然后使用正则表达式/\d/g 获取数字。
function digitsInText(rootDomNode) {
var text = rootDomNode.textContent || rootDomNode.innerText;
return text.match(/\d/g) || [];
}
例如,
alert(digitsInText(document.body));
如果您的 HTML 不在 DOM 中,您可以尝试自己剥离标签:JavaScript: How to strip HTML tags from string?
既然你需要做一个替换,我仍然会尝试遍历 DOM 并单独对文本节点进行操作,但如果这不可能,请尝试
var HTML_TOKEN = /(?:[^<\d]|<(?!\/?[a-z]|!--))+|<!--[\s\S]*?-->|<\/?[a-z](?:[^">']|"[^"]*"|'[^']*')*>|(\d+)/gi;
function incrementAllNumbersInHtmlTextNodes(html) {
return html.replace(HTML_TOKEN, function (all, digits) {
if ("string" === typeof digits) {
return "" + (+digits + 1);
}
return all;
});
}
然后
incrementAllNumbersInHtmlTextNodes(
'<b>123</b>Hello, World!<p>I <3 Ponies</p><div id=123>245</div>')
生产
'<b>124</b>Hello, World!<p>I <4 Ponies</p><div id=123>246</div>'
它会混淆像 <script> 这样的特殊元素在哪里结束,并且无法识别实体编码的数字,但应该可以正常工作。