Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript字符串拆分中的正则表达式,浏览器兼容性问题_Javascript_Regex_Cross Browser - Fatal编程技术网

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

javascript字符串拆分中的正则表达式,浏览器兼容性问题,javascript,regex,cross-browser,Javascript,Regex,Cross Browser,我一直在调查这个问题,但越挖越深,情况似乎越糟 我开始天真地尝试使用此表达式拆分HTML“br”标记上的字符串: T = captions.innerHTML.split(/<br.*?>/g); T=captions.innerHTML.split(//g); 这适用于除IE7和IE8之外的所有浏览器(FF、Safari、Chrome),示例输入文本如下: is invariably subjective. <br /> The less frequently u

我一直在调查这个问题,但越挖越深,情况似乎越糟

我开始天真地尝试使用此表达式拆分HTML“br”标记上的字符串:

T = captions.innerHTML.split(/<br.*?>/g);
T=captions.innerHTML.split(//g);
这适用于除IE7和IE8之外的所有浏览器(FF、Safari、Chrome),示例输入文本如下:

is invariably subjective. <br /> 
The less frequently used warnings (Probably/Possibly) <br /> 
<div id='box'>
Hello<br>
World
</div>
总是主观的
较少使用的警告(可能/可能)
请注意,示例文本在“/”前面有一个空格,在新行前面有一个空格

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

T = captions.innerHTML.split(/<.*?>/g);
T = captions.innerHTML.split(/<.+?>/g);
T=captions.innerHTML.split(//g);
T=captions.innerHTML.split(//g);
然而,令人惊讶的是(至少对我来说),这在FF和Chrome中不起作用:

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

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

T = captions.innerHTML.split(/<br[^>]*>/g);
T=captions.innerHTML.split(/]*>/g);
(它在Chrome和FF上确实有效。)

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

PS-我的doctype是HTML过渡

编辑:

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

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

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

试试这个:

/<br[^>]*>/gi
/]*>/gi

正则表达式根本不擅长解析HTML(请参阅原因)。您需要的是一个HTML解析器。有关使用各种解析器的示例,请参见

您可能特别感兴趣的是。

而不是

/<br.*?>/
//
你可以试试

/<br[^>]*>/
/]*>/

i、 e.匹配
“嗯,不幸的是,我的浏览器种类不多(只是IE-sigh),但我马上就能找到一种优化正则表达式的方法:

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

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

在Firefox 3&IE7中测试:

/<br.*?>/gi
//gi
你自己在这里试试吧:

var input=“一个
\n” +“两个
\n” +“三个
\n” ; 警报(input.replace(//gi',);
您的代码无法工作的原因是IE解析HTML,并在您通过innerHTML读取标记时使其大写。例如,如果您有如下HTML:

is invariably subjective. <br /> 
The less frequently used warnings (Probably/Possibly) <br /> 
<div id='box'>
Hello<br>
World
</div>
您将获得一个带有以下内容的警报框:

Hello<BR>World
你好
世界
请注意,

现在是大写。要解决这个问题,只需在
g
标志之外添加
i
标志,使正则表达式不区分大小写,它将按预期工作。

火柴

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






我在IE.6中进行了测试。如果3月份还可以,js当然可以根据regexp进行拆分。

PPS-我目前没有测试IE6或Opera,但是如果相关的话,请随意讨论这些。我建议/gi,因为你永远不知道有人会如何证明他们的标签。这在Chrome和FF中工作,在IE中失败。我给+1是因为它应该工作。顺便说一句,a我现在意识到,当它完全按照您在这里提供的方式使用时不会失败。我省略了“I”标志,因为我使用的是已知的小写源代码。经验教训:IE up cases标记位于innerHTML中。谢谢,仍然只在IE中失败。是的,我不打算使用完整的HTML解析器,这不是一个jQuery环境。请注意,这没有问题我希望正则表达式能够处理这个问题,但是IE 7和IE 8中的浏览器兼容性问题(尽管在FF中失败的例子也让我感到困惑。)“正则表达式在解析HTML方面根本不好“--如果你知道输入是什么样子的话就不会了。@Walt Gordon Jones这不是你打算做什么或不做什么的问题,正则表达式不能处理HTML,这不是他们擅长的,至少看看用解析器做这件事,你总是可以使用DOM。@nickf输入会保持不变吗?”?从长远来看,使用解析器可以节省时间,因为正则表达式在解析HTML时非常脆弱(如果它们一开始就可以工作的话)。您提出了一个很好的观点,但在本例中,我只需要使用“br”标记作为分隔符创建一个数组。我不认为有DOM方法可以做到这一点,是吗?在一些正则表达式引擎中?运算符表示非贪婪匹配,其中/?>/将匹配任何字符,直到以下文本匹配的第一个点。如果没有?,/.*>/匹配到以下文本匹配的最后一点。是的,想要第一个匹配(显然),但是[^>]看起来是强制第一个匹配的聪明方法,因为这是满足条件的唯一方法。无论如何,在IE下,即使是贪婪的变体也根本不匹配。我相信我已经确定了问题是IE上的String.split(您的示例使用String replace。)查看此测试用例矩阵,了解split():IE在大约30%的情况下失败。FF和Chrome可以100%通过这个矩阵。然后你可以尝试用正则表达式替换
标记,用“| | br | | |”替换标记,然后用普通的非正则表达式拆分它吗?input.replace(//gi,“| | BR | |”).split(“| | BR | |”);那行吗?是的,你完全正确。非常感谢,现在我对IE上的innerHTML有了新的了解。