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

时间:2009-05-04 22:40:30

标签: javascript regex cross-browser

我一直在研究这个问题,只是越来越深,我越深入。

我开始无辜地尝试使用这个表达式在HTML'br'标签上分割字符串:

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

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

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标签)。并且任何人都可以确认上面的最后一个示例应该是有效匹配,因为在'&gt;'之前的示例文本中存在两个字符。

PS - 我的doctype是HTML过渡。

编辑:

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

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

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

7 个答案:

答案 0 :(得分:15)

您的代码无法正常工作的原因是因为IE解析HTML并在您通过innerHTML读取时将标记设置为大写。例如,如果你有这样的HTML:

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

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

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

您将收到一个警告框:

Hello<BR>World

请注意<BR>现在是大写的。要解决此问题,除了i标志之外,只需添加g标志,以使正则表达式不区分大小写,并且它将按预期工作。

答案 1 :(得分:6)

试试这个:

/<br[^>]*>/gi

答案 2 :(得分:1)

而不是

/<br.*?>/

你可以尝试

/<br[^>]*>/

即。匹配"<br",后跟'>'以外的任何字符,后跟'>'

答案 3 :(得分:0)

正则表达式在解析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感兴趣。

答案 4 :(得分:0)

嗯,不幸的是我没有各种各样的浏览器在工作(只是IE - 叹息)但是马上就可以看到一种方法来优化你的正则表达式:

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

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

答案 5 :(得分:0)

在Firefox 3&amp ;;中测试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)

&LT; \ S BR \ S / \ S * GT;

匹配

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

我在IE.6中测试了here。如果march是Ok,则js肯定会根据正则表达式进行拆分。