如何遍历文本并替换特定词

时间:2018-09-17 08:28:01

标签: javascript conditional string-matching

我正在尝试编写一个简单的函数,该函数可遍历文本并替换文本中遇到的所有href;

 if (webSource.grab()) {
                    try {
                        webSource.retrieve(frame);
                        Graphics g = jPanel1.getGraphics();
                        faceDetector.detectMultiScale(frame, faceDetections);
                        for (Rect rect : faceDetections.toArray()) {
                           // System.out.println("ttt");
                            Core.rectangle(frame, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
                                    new Scalar(0, 255,0));
                        }
                        Highgui.imencode(".bmp", frame, mem);
                        Image im = ImageIO.read(new ByteArrayInputStream(mem.toArray()));
                        BufferedImage buff = (BufferedImage) im;
                        if (g.drawImage(buff, 0, 0, getWidth(), getHeight()-150 , 0, 0, buff.getWidth(), buff.getHeight(), null)) {
                            if (runnable == false) {
                                System.out.println("Paused ..... ");
                                this.wait();
                            }
                        }
                    } catch (Exception ex) {
                        System.out.println("Error!!");
                        ex.printStackTrace();
                    }
                }
            }

我觉得我可能没有正确使用match方法或条件运算符,但据我了解,这应该可以工作。但是,当然不是。

2 个答案:

答案 0 :(得分:0)

如果您要替换文本中的链接(我想),请尝试以下正则表达式:

   /<a.*?href="www.anyhref.com".*?\/a>/g

然后,您需要为要替换数组中的条目的每个href添加。

答案 1 :(得分:0)

如果您在DOM上下文中,则可以执行以下操作:

要遍历DOM,可以使用以下功能:

function domReplace(node, iterator) {
  switch (node && node.nodeType) {
  case 1: case 9: case 11: {
    const newNode = iterator((node.nodeName || '').toLowerCase(), node);
    if (newNode && newNode != node && node.parentNode) {
        node.parentNode.insertBefore(newNode, node);
        node.parentNode.removeChild(node);
    }
    for (let child = newNode.firstChild; child; child = child.nextSibling)
       domReplace(child, iterator);
  } break ;
  case 3: {
    const newNode = iterator('#text', node);
    if (newNode && newNode != node && node.parentNode) {
        node.parentNode.insertBefore(newNode, node);
        node.parentNode.removeChild(node);
    }
  } break ;
  }
}

然后,如果模式与自定义文本匹配a,则可以替换.href

domReplace(document, (type, node) => {
  if (type == 'a') {
    for (let i = 0; i < REPLACE.length; i += 1)
      if (~(node.href || '').indexOf(REPLACE[i].expression))
         return document.createTextNode(REPLACE[i].value);
    return document.createTextNode(node.href);
  }
  return node;
});

请注意,您不应将document赋予domReplace,而应使用正确的dom节点,以避免整个页面替换