正则表达式,以避免替换部分html标记

时间:2015-09-20 12:16:36

标签: javascript regex

例如,我有一个字符串<i class='highlight'>L</i>olopolo。我需要将字母l更改为<i class='highlight'>l</i>。如何使正则表达式忽略标签及其中的所有内容?

4 个答案:

答案 0 :(得分:1)

试试这个:

var string = "<i class='highlight'>L</i>olopolo";
string = string.replace(/l(?![^>]+>)(?![^<]*<\/)/g, "<i class='highlight'>l</i>");
alert(string);

如果您想拥有任意文本,那么您可以使用以下代码:

var text = "foo";
var re = new RegExp(text + '(?![^>]+>)(?![^<]*</)', 'g');
var string = "<i class='highlight'>foobar</i>foobarfoobar";
string = string.replace(re, "<i class='highlight'>" + text + "</i>");
alert(string);

答案 1 :(得分:1)

如前所述,使用正则表达式并不是最好的主意,所以接下来最好的事情是循环文本节点并添加元素。

&#13;
&#13;
var charSplit = "l";
var elem = document.querySelector(".x");
var nodes = elem.childNodes;
for(var i=nodes.length-1;i>=0;i--){
   var node = nodes[i];
   if(node.nodeType === 3) {  //this is a text node
       var last = node;       
       var parts = node.nodeValue.split(charSplit);  //split of the character we are supposed to match
       node.nodeValue = parts[parts.length-1];  //set text node value to last index's value
       for (var j=parts.length-2; j>=0;j--){  //loop backwards ingnoring the last index since we already put that text in the textode
           var it = document.createElement("i");  //create the new element to add
           it.className="highligt";
           it.innerHTML = charSplit;
           node.parentNode.insertBefore(it,last);  //add it before the text node
           var tx = document.createTextNode(parts[j]);  //create new text node for text that becomes before the element
           node.parentNode.insertBefore(tx,it);  
           last = tx;
       }
   }
}
&#13;
<p class="x"><i class='highlight'>L</i>olopolo</p>
&#13;
&#13;
&#13;

答案 2 :(得分:1)

我会建议像这样的东西,使用最少(而不是那么复杂)的正则表达式。如果你的字符串最初是html的一部分 - &gt;你可以得到父母,并改变textContent和innerHTML:

import math
n = math.sqrt(int(raw_input("Enter a number\n")))
print n

演示:http://jsfiddle.net/LzbkhLx7/

P.S。解释 - textContent将为您提供'纯'字符串/文本,没有HTML标记 - 然后您可以轻松地包装每次出现的l / L.

答案 3 :(得分:-1)

import javax.swing.*;

public class MyLargeTextArea extends JPanel {

    private static final int ROWS = 20;
    private static final int COLS = 40;
    private JTextArea textArea = new JTextArea(ROWS, COLS);

    public MyLargeTextArea() {
        textArea.setText("This is a small amount of text");

        // so lines wrap
        textArea.setWrapStyleWord(true);
        textArea.setLineWrap(true);

        add(new JScrollPane(textArea));
    }

    private static void createAndShowGui() {
        MyLargeTextArea mainPanel = new MyLargeTextArea();

        JFrame frame = new JFrame("MyLargeTextArea");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

不需要正则表达式。

或者如果您想将字母从大写更改为小写

document.getElementsByClassName("highlight")[0].innerHTML = "l";

当然,你必须确保在执行之前可以在innerHTML上调用toLowerCase(或其他方法)。