我想通过 javascript 正则表达式获取 html 内部文本中的数字来替换它们。
例如,在下面的代码中,我想获得 1,2,3,4,5,6,1,2,3,1,2,3,而不是 div 标签内的 444。
<body>
aaaa123aaa456
<div style="background: #444">aaaa123aaaa</div>
aaaa123aaa
</body>
什么可能是正则表达式?
我想通过 javascript 正则表达式获取 html 内部文本中的数字来替换它们。
例如,在下面的代码中,我想获得 1,2,3,4,5,6,1,2,3,1,2,3,而不是 div 标签内的 444。
<body>
aaaa123aaa456
<div style="background: #444">aaaa123aaaa</div>
aaaa123aaa
</body>
什么可能是正则表达式?
您最好的选择是使用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:如何从字符串中剥离 HTML 标签?
由于您需要进行替换,我仍然会尝试遍历 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>
结束)的位置,并且无法识别实体编码的数字,但应该以其他方式工作。
您不一定需要 RegExp 来获取不包括其后代元素的元素的文本内容——事实上,我建议不要这样做,因为 RegExp 匹配 HTML 非常困难——有 DOM 解决方案:
function getImmediateText(element){
var text = '';
// Text and elements are all DOM nodes. We can grab the lot of immediate descendants and cycle through them.
for(var i = 0, l = element.childNodes.length, node; i < l, node = element.childNodes[i]; ++i){
// nodeType 3 is text
if(node.nodeType === 3){
text += node.nodeValue;
}
}
return text;
}
var bodyText = getImmediateText(document.getElementsByTagName('body')[0]);
所以这里有一个函数,它只将直接文本内容作为字符串返回。当然,您可以使用 RegExp 将其剥离为数字,如下所示:
var numberString = bodyText.match(/\d+/g).join('');
只是为了回答我的老问题:
可以通过前瞻来实现。
/\d(?=[^<>]*(<|$))/g
替换数字
html.replace(/\d(?=[^<>]*(<|$))/g, function($0) {
return map[$0]
});