HTMLの内部テキストの数字をjavascript正規表現で取得して置き換えたいです。
たとえば、次のコードでは、1,2,3,4,5,6,1,2,3,1,2,3 を取得したいのですが、div タグ内の 444 は取得したくありません。
<body>
aaaa123aaa456
<div style="background: #444">aaaa123aaaa</div>
aaaa123aaa
</body>
正規表現は何ですか?
HTMLの内部テキストの数字をjavascript正規表現で取得して置き換えたいです。
たとえば、次のコードでは、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>'
endのような特別な要素の周りで混乱し、<script>
エンティティがエンコードされた数字を認識しませんが、それ以外の場合は機能するはずです。
子孫要素を除く要素のテキスト コンテンツを取得するために必ずしも RegExp が必要というわけではありません。
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('');