我一直在研究这个问题,只是越来越深,我越深入。
我开始无辜地尝试使用这个表达式在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的解决方案,该测试矩阵的作者提供的库没有解决这个问题。
答案 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肯定会根据正则表达式进行拆分。