我需要使用javascript来替换iframe的src属性,使用javascript来分析原始(基于文本的)代码(在注入DOM之前)。一个简单的版本可以使用这样的正则表达式:
/<iframe\s*[^>]*src\s*=\s*(\"[^\"]*\"|\'[^\']*\'|[^\s>]*)/
注意:我只对设置了src属性的iframe感兴趣。
在大多数情况下,这可能会有效,但&gt;字符可以出现在字符串文字中,例如<iframe id="pointforward\>" src="http://www.test.se">
,这将导致简单的正则表达式无法匹配(授予的不是你会看到的东西,但是允许,因此可以发生这样的变体)。
我提出了以下更复杂的版本:
/<iframe\s+(?:\b(?:(src)|\w+)\b\s*=\s*((?:\"(?:\\[\s\S]|[^\"\\])*\")|(?:\'(?:\\[\s\S]|[^\'\\])*\')|[^\s>]+)\s*|\b(\w+)\b\s*)*>/
Breakdown:
<iframe\s+
(?:
\b(?:(src)|\w+)\b "src" or any attribute name (capture if src)
\s*=\s* equals possible surrounded with whitespace
((?: Capture group for value
\"(?:\\[\s\S]|[^\"\\])*\" value enclosed in double quotes
)|(?: OR
\'(?:\\[\s\S]|[^\'\\])*\' value enclosed in single quotes
)| OR
[^\s>]+ value with no quotes
)\s*| OR
\b(\w+)\b\s* standalone attribute
)*> 0..N attributes and closing >
正则表达式功能的描述:正则表达式旨在匹配具有可变数量属性的iframe标记。属性可以是名称=值对或独立(例如无缝)。名称=值对的值可以用双引号,单引号或无引号括起来 - 引号之间的文本可以包含转义字符(包括转义的双引号和单引号)。捕获组捕获第一个捕获组中的src属性名称和第二个捕获组中的值。我将使用捕获组来提取src属性值。
我正在寻找有关正则表达式质量和选择的建议。简单的一个可能会错过一些异常格式化的iframe标签(也许还有一些其他的 - 请告诉我是否还有其他问题我应该考虑)。复杂的我对此并不感到自信 - 尽管我自己写了这篇文章但我并没有感觉到它并且想知道我是否真的涵盖了iframe标签的所有替代方式格式化。而且,更复杂的是,它可能会运行缓慢。到目前为止,我只用简单的代码变体测试了这两个版本,显然需要做更多的测试,但我想得到一些关于选择哪条路线的反馈 - 更简单的版本并接受它有时会错过或更复杂的版本(可能因为它太聪明而错过了)。我知道使用带有html的正则表达式的一般问题(你永远无法捕获所有内容),并且会有一些东西,如果使用的srcdoc属性将为我搞砸(但不会与src一起使用)属性所以我应该在那里安全)。
问题回顾:我想要了解正则表达式的质量以及追求的策略 - 简单/复杂。