代码之家  ›  专栏  ›  技术社区  ›  Walt Jones

javascript字符串拆分中的正则表达式,浏览器兼容性问题

  •  5
  • Walt Jones  · 技术社区  · 17 年前

    我一直在调查这个问题,但我越挖越深,情况就越糟糕。

    我开始天真地尝试使用这个表达式来拆分HTML'br'标记上的字符串:

    T = captions.innerHTML.split(/<br.*?>/g);
    

    这适用于除IE7和IE8以外的所有浏览器(FF、Safari、Chrome),示例输入文本如下:

    is invariably subjective. <br /> 
    The less frequently used warnings (Probably/Possibly) <br /> 
    

    请注意,示例文本在“/”之前包含一个空格,并在新行之前。

    以下两项都将匹配每个浏览器中的所有HTML标记:

    T = captions.innerHTML.split(/<.*?>/g);
    T = captions.innerHTML.split(/<.+?>/g);
    

    然而,令人惊讶的是(至少对我来说),这 使用FF和Chrome:

    T = captions.innerHTML.split(/<br.+?>/g);
    

    编辑:

    这(在下面的回答中建议了几次)不适用于IE 7或8:

    T = captions.innerHTML.split(/<br[^>]*>/g);
    

    (它在Chrome和FF上起作用。)

    我的问题是:是否有人知道一个表达式可以在所有当前浏览器中与上面的“br”标记匹配(但不知道其他HTML标记)。而且,是否有人可以确认上述最后一个示例应该是有效的匹配项,因为示例文本中的“>”前面有两个字符。

    PS-我的doctype是html过渡。

    编辑:

    我认为我有证据表明这是特定于IE上的string.split()行为,而不是一般的regex。您必须使用split()来查看此问题。我还发现了一个测试矩阵,当我在IE上运行split()测试用例时,它的失败率约为30%。同样的测试在FF和Chrome上100%通过:

    http://stevenlevithan.com/demo/split.cfm

    到目前为止,我还没有找到IE的解决方案,并且该测试矩阵的作者提供的库没有解决这个问题。

    7 回复  |  直到 17 年前
        1
  •  15
  •   Paolo Bergantino    17 年前

    您的代码不起作用的原因是,IE解析HTML并在通过innerhtml读取时使标记变为大写。例如,如果您有这样的HTML:

    <div id='box'>
    Hello<br>
    World
    </div>
    

    然后使用这个javascript(在IE中):

    alert(document.getElementById('box').innerHTML);
    

    您将收到一个包含以下内容的警告框:

    Hello<BR>World
    

    注意到 <BR> 现在是大写。要解决此问题,只需添加 i 除此之外的标志 g 使regex不区分大小写的标志,它将按预期工作。

        2
  •  6
  •   Chad Birch    17 年前

    试试这个:

    /<br[^>]*>/gi
    
        3
  •  1
  •   hlovdal    17 年前

    而不是

    /<br.*?>/
    

    你可以试试

    /<br[^>]*>/
    

    即匹配 "<br" ,后跟除 '>' 紧随其后 “&” .

        4
  •  0
  •   Goyuix    17 年前

    不幸的是,我在工作中没有各种各样的浏览器(只是IE-SIGH),但是马上我就可以看到一种优化regex的方法:

    T = captions.innerHTML.split(/<br[^>]*?>/g);
    

    内联字符类定义[^>]指示表达式匹配除大于号以外的任何字符。您可能还希望使其不区分大小写(在末尾传递gi,而不仅仅是g)。

        5
  •  0
  •   nickf    17 年前

    在firefox 3&ie7中测试:

    /<br.*?>/gi
    

    在这里亲自尝试: http://jsbin.com/ofoke

    var input = "one <br/>\n" 
              + "two <br />\n" 
              + "three <br>\n" 
    ; 
    
    alert(input.replace(/<br.*?>/gi, ''));
    
        6
  •  0
  •   Community Mohan Dere    9 年前

    regex在解析HTML方面根本不擅长(请参见 Can you provide some examples of why it is hard to parse XML and HTML with a regex? 为什么?您需要的是一个HTML解析器。见 Can you provide an example of parsing HTML with your favorite parser? 例如使用各种解析器。

    尤其是你可能对 JavaScript+DOM answer .

        7
  •  0
  •   unigogo    17 年前

    <的S BR ?s*gt;

    比赛

    <br>, <br />, < br >,<br / >
    

    我测试过 here 在IE.6中。如果三月可以,JS当然可以根据regexp将其拆分。