当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《JavascriptRegexp-匹配字符串模式,除非string在指定的标记内》经验,为你挑选了1个好方法。

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

\?\?\?([A-Z0-9]*)\?\?\?

但是,我想排除链接中的任何结果:" ...我的模式...... ",我对如何做到这一点有点困惑,所有我的尝试暂时失败了.



1> Borgar..:

你正在研究什么样的"HTML"并不是很清楚.如果它是HTML 代码,可能来自Ajax请求,那么你可以使用正则表达式; 匹配链接模式,然后找出在回调中要做的事情:

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

方便的是,replace() 可以将回调函数作为替换生成器而不是简单的字符串.

但是,如果您正在处理实时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

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

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有