0

我想通过 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>

什么可能是正则表达式?

4

3 回答 3

4

您最好的选择是使用innerTexttextContent获取没有标签的文本,然后只使用正则表达式/\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>结束)的位置,并且无法识别实体编码的数字,但应该以其他方式工作。

于 2013-02-19T20:22:37.523 回答
0

您不一定需要 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('');
于 2013-02-19T20:31:35.953 回答
0

只是为了回答我的老问题:
可以通过前瞻来实现。

/\d(?=[^<>]*(<|$))/g

替换数字

    html.replace(/\d(?=[^<>]*(<|$))/g, function($0) {
        return map[$0]
    });

答案的来源https://www.drupal.org/node/619198#comment-5710052

于 2021-08-17T20:54:23.437 回答