gpt4 book ai didi

Javascript Regexp - 匹配字符串模式,除非字符串在指定标签内

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:20:14 25 4
gpt4 key购买 nike

我正在尝试替换所有出现的 ???some.text.and.dots???在 html 页面上添加链接。我已经构建了这个执行它的正则表达式:

\?\?\?([a-z0-9.]*)\?\?\?

但是,我想排除链接内的任何结果:“ ... MY PATTERN ... ”,我对如何做有点困惑那,我所有的尝试现在都失败了。

最佳答案

目前还不清楚您正在处理哪种“HTML”。如果它是 HTML 代码,可能来自 Ajax 请求,那么您可以使用正则表达式;匹配链接 模式,然后计算出在回调中要做什么:

var html = document.body.innerHTML;
html = html.replace(/(<a\s.*?>.*?<\/a>)|(\?\?\?([a-z0-9.]*)\?\?\?)/g,
function ( a, b, c, d ) {
return ( a[0] == '<' ) ? a : '<a href="#">' + d + '</a>';
});
context.innerHTML = html;

方便地,replace() can take a callback function作为替代生成器而不是简单的字符串。

但是,如果您正在处理动态 DOM 树,您可能希望尊重节点上的事件,而不是简单地重置 innerHTML。为此,您需要更原始的方法:

// returns all childnodes of type text that do not have A as parent
function walker ( node ) {
var nodes = [];
for (var c, i = 0; c = node.childNodes[i]; i++) {
if ( c.nodeType === 1 && c.tagName !== 'A' ) {
nodes = nodes.concat( arguments.callee( c ) );
}
else if ( c.nodeType === 3 ) {
nodes.push( c );
}
}
return nodes;
}

var textNodes = walker( document.body );
for (var i = 0; i < textNodes.length; i++) {
// create an array of strings separating the pattern
var m = textNodes[i].nodeValue.split( /(\?\?\?([a-z0-9.]*)\?\?\?)/ );
if ( m.length > 1 ) {
for (var j=0; j<m.length; j++) {
var t, parent = textNodes[i].parentNode;
// create a link for any occurence of the pattern
if ( /^\?\?\?([a-z0-9.]*)\?\?\?$/.test( m[j] ) ) {
var a = document.createElement( 'a' );
a.href = "#";
a.innerHTML = RegExp.$1; // m[j] if you don't want to crop the ???'s
parent.insertBefore( a, textNodes[i] );
t = document.createTextNode( ' ' ); // whitespace padding
}
else {
t = document.createTextNode( m[j] );
}
parent.insertBefore( t, textNodes[i] );
}
// remove original text node
parent.removeChild( textNodes[i] );
}
}

此方法仅触及文本节点,然后仅触及与模式匹配的文本节点。

关于Javascript Regexp - 匹配字符串模式,除非字符串在指定标签内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/321947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com